@balena/jellyfish-metrics v0.0.196-renovate-ignore-node-0ebca563c11dcf58b6a39ba17a457fda3100bac4
Jellyfish Metrics
This library gathers Prometheus metrics and exposes them to be scraped by balena-monitor.
Usage
Below is an example how to use this library:
const metrics = require('@balena/jellyfish-metrics')
// Start server to expose gathered metrics data.
metrics.startServer(context, portNumber)
// Mark that a card was read from the database.
metrics.markCardReadFromDatabase(card)Documentation
A module that gathers and exposes Prometheus metrics.
- metrics
- static
- .actorFromContext(context) ⇒ String
- .initExpress(context) ⇒ Object
- .startServer(context, port)
- .markCardInsert(card)
- .markCardUpsert(card)
- .markCardReadFromDatabase(card)
- .markCardReadFromCache(card)
- .markBackSync(integration)
- .markActionRequest(action)
- .markQueueConcurrency()
- .markJobAdd(action, id)
- .markJobDone(action, id, timestamp)
- .measureMirror(integration, fn) ⇒ Any
- .measureTranslate(integration, fn) ⇒ Any
- .measureHttpQuery(fn) ⇒ Any
- .measureHttpType(fn) ⇒ Any
- .measureHttpId(fn) ⇒ Any
- .measureHttpSlug(fn) ⇒ Any
- .measureHttpAction(fn) ⇒ Any
- .measureHttpWhoami(fn) ⇒ Any
- .markSqlGenTime(ms)
- .markQueryTime(ms)
- .markStreamOpened(context, table)
- .markStreamClosed(context, table)
- .markStreamLinkQuery(context, table, change)
- .markStreamError(context, table)
- inner
- ~measureAsync(name, labels, fn) ⇒ Any
- ~isCard(card) ⇒ Boolean
- ~getAsyncMeasureFn(prefix) ⇒ Any
- static
metrics.actorFromContext(context) ⇒ String
Kind: static method of metrics
Summary: Extract actor name from context ID
Returns: String - actor name
| Param | Type | Description |
|---|---|---|
| context | Object | caller context |
Example
const actorName = exports.actorFromContext(context)metrics.initExpress(context) ⇒ Object
Kind: static method of metrics
Summary: Create express app using metrics and expose data on /metrics
Returns: Object - express app
| Param | Type | Description |
|---|---|---|
| context | Object | execution context |
Example
const application = metrics.initExpress(context)metrics.startServer(context, port)
Expose gathered metrics on /metrics Reassign port to random port number on collision
Kind: static method of metrics
| Param | Type | Description |
|---|---|---|
| context | Object | execution context |
| port | Number | port to expose metrics on |
Example
metrics.startServer(context, 9000)metrics.markCardInsert(card)
Kind: static method of metrics
Summary: Mark that a card was inserted
| Param | Type | Description |
|---|---|---|
| card | Object | card that was inserted |
Example
metrics.markCardInsert(card)metrics.markCardUpsert(card)
Kind: static method of metrics
Summary: Mark that a card was upserted
| Param | Type | Description |
|---|---|---|
| card | Object | card that was upserted |
Example
metrics.markCardUpsert(card)metrics.markCardReadFromDatabase(card)
Kind: static method of metrics
Summary: Mark that a card was read from the database
| Param | Type | Description |
|---|---|---|
| card | Object | card that was read the database |
Example
metrics.markCardReadFromDatabase(card)metrics.markCardReadFromCache(card)
Kind: static method of metrics
Summary: Mark that a card was read from cache
| Param | Type | Description |
|---|---|---|
| card | Object | card that was read from cache |
Example
metrics.markCardReadFromCache(card)metrics.markBackSync(integration)
Kind: static method of metrics
Summary: Mark that a card has been created due to back-sync
| Param | Type | Description |
|---|---|---|
| integration | String | name of integration |
Example
metrics.markBackSync('front')metrics.markActionRequest(action)
Kind: static method of metrics
Summary: Mark that an action request was received
| Param | Type | Description |
|---|---|---|
| action | String | action name |
Example
metrics.markActionRequest('action-create-card')metrics.markQueueConcurrency()
Kind: static method of metrics
Summary: Expose current queue concurrency setting
Example
metrics.markQueueConcurrency()metrics.markJobAdd(action, id)
Kind: static method of metrics
Summary: Mark that a new job was added to the queue
| Param | Type | Description |
|---|---|---|
| action | String | action name |
| id | String | id of the worker |
Example
metrics.markJobAdd('action-create-card', context.id)metrics.markJobDone(action, id, timestamp)
Kind: static method of metrics
Summary: Mark that a job in the queue has completed
| Param | Type | Description |
|---|---|---|
| action | String | action name |
| id | String | id of the worker |
| timestamp | String | when action was completed |
Example
const action = 'action-create-card'
const timestamp = '2020-06-08T09:33:27.481Z'
metrics.markJobDone(action, context.id, timestamp)metrics.measureMirror(integration, fn) ⇒ Any
Kind: static method of metrics
Summary: Execute a mirror, marking duration and totals
Returns: Any - mirror result
| Param | Type | Description |
|---|---|---|
| integration | Object | name of external integration |
| fn | Promise | mirror function to execute |
Example
const result = await metrics.measureMirror('github', mirror())metrics.measureTranslate(integration, fn) ⇒ Any
Kind: static method of metrics
Summary: Execute a translate, marking duration and totals
Returns: Any - translate result
| Param | Type | Description |
|---|---|---|
| integration | Object | name of external integration |
| fn | Promise | mirror function to execute |
Example
const result = await metrics.measureTranslate('github', translate())metrics.measureHttpQuery(fn) ⇒ Any
Kind: static method of metrics
Summary: Measure the duration of a request to the /query api endpoint
Returns: Any - api result
| Param | Type | Description |
|---|---|---|
| fn | Promise | api function to execute |
metrics.measureHttpType(fn) ⇒ Any
Kind: static method of metrics
Summary: Measure the duration of a request to the /type api endpoint
Returns: Any - api result
| Param | Type | Description |
|---|---|---|
| fn | Promise | api function to execute |
metrics.measureHttpId(fn) ⇒ Any
Kind: static method of metrics
Summary: Measure the duration of a request to the /id api endpoint
Returns: Any - api result
| Param | Type | Description |
|---|---|---|
| fn | Promise | api function to execute |
metrics.measureHttpSlug(fn) ⇒ Any
Kind: static method of metrics
Summary: Measure the duration of a request to the /slug api endpoint
Returns: Any - api result
| Param | Type | Description |
|---|---|---|
| fn | Promise | api function to execute |
metrics.measureHttpAction(fn) ⇒ Any
Kind: static method of metrics
Summary: Measure the duration of a request to the /action api endpoint
Returns: Any - api result
| Param | Type | Description |
|---|---|---|
| fn | Promise | api function to execute |
metrics.measureHttpWhoami(fn) ⇒ Any
Kind: static method of metrics
Summary: Measure the duration of a request to the /action api endpoint
Returns: Any - api result
| Param | Type | Description |
|---|---|---|
| fn | Promise | api function to execute |
metrics.markSqlGenTime(ms)
Kind: static method of metrics
Summary: Mark how long it took to generate an SQL query from a JSON schema
| Param | Type | Description |
|---|---|---|
| ms | Number | number of milliseconds it took to generate the query |
metrics.markQueryTime(ms)
Kind: static method of metrics
Summary: Mark how long it took to execute an SQL query
| Param | Type | Description |
|---|---|---|
| ms | Number | number of milliseconds it took to execute the query |
metrics.markStreamOpened(context, table)
Kind: static method of metrics
Summary: Mark that a new stream was opened
| Param | Type | Description |
|---|---|---|
| context | Object | caller context |
| table | String | table name |
Example
metrics.markStreamOpened(context, 'cards')metrics.markStreamClosed(context, table)
Kind: static method of metrics
Summary: Mark that a stream was closed
| Param | Type | Description |
|---|---|---|
| context | Object | caller context |
| table | String | table name |
Example
metrics.markStreamClosed(context, 'cards')metrics.markStreamLinkQuery(context, table, change)
Kind: static method of metrics
Summary: Mark that a stream is querying links
| Param | Type | Description |
|---|---|---|
| context | Object | caller context |
| table | String | table name |
| change | Object | change event object |
Example
metrics.markStreamLinkQuery(context, 'cards', change)metrics.markStreamError(context, table)
Kind: static method of metrics
Summary: Mark that a stream error has occurred
| Param | Type | Description |
|---|---|---|
| context | Object | caller context |
| table | String | table name |
Example
metrics.markStreamError()metrics~measureAsync(name, labels, fn) ⇒ Any
Kind: inner method of metrics
Summary: Measure duration of a promise execution and add to metrics
Returns: Any - promise execution result
| Param | Type | Description |
|---|---|---|
| name | String | metric name |
| labels | Object | Undefined | metric labels |
| fn | Promise | function to execute and measure |
Example
const result = await measureAsync('my_metric', { ... }, myFunction, ...params)metrics~isCard(card) ⇒ Boolean
Kind: inner method of metrics
Summary: Checks if an object looks to be a valid card or not.
Returns: Boolean - validation result, true if card, false if not
| Param | Type | Description |
|---|---|---|
| card | Object | object to validate |
Example
const result = isCard(card)metrics~getAsyncMeasureFn(prefix) ⇒ Any
Kind: inner method of metrics
Summary: Generates a generic measurement wrapper for an async function, that
tracks total calls, total failures and duration
Returns: Any - api result
| Param | Type | Description |
|---|---|---|
| prefix | String | metric name prefix |
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
4 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago