* prom-client JSON to InfluxDB line protocol converter * Converts a metric with separate names * prom-client JSON to InfluxDB line protocol (version 2) converter * Server has instance id * Read the instance id from an environment variable * More unit tests for instance-metadata * Log instance id * Push influx metrics * INSTANCE_ID with dyno metadata * Prepare influx metrics in one place * Influx metrics endpoint should return metrics * More readable tests * Env added to instance metadata * hostname as an instance label value * HEROKU_DYNO_ID as an instance id for heroku * Instance env can be set by env variable * HEROKU_APP_NAME as an instance env * Log instance metadata as a JSON * Typo fix * Code refactoring in tests * wait-for-expect dev dependency added * Test for pushing metrics * Test for pushing metrics * Use basic authentication for pushing metrics * intervalSeconds=2 for development env * Using existing methods * TODOs removed * Schema for influx credentials * Influx config removed from config files * Require username and password when influx metrics are enabled * Unused args removed * pushing component should log errors * Speed up tests * should log error responses * InstanceMetadata class replaces by simple object * Influx metrics can be configuredd by env variables * Use application label name instead of service * Unused code removed * Integration test for prom-client and converter * metrics.influx.enabled configuration option added * Improved influx configuration schema * instanceMetadata validation * Typo fix * Default value for env * metrics.infux.hostnameAsAInstanceId added * should add hostname as an instance label when hostnameAsAInstanceId is enabled * Default values for influx configuration * flatMap is not available in Node.js 9.4 * Env vars removed from Procfile * Better instance metadata values in tests * Typo fix * lodash.groupby added to prod dependencies * Allow other keys in private config * Missing test - should allow other private keys when influx metrics are enabled * Missing test - should require private metrics config when influx configuration is enabled * log.error instead of console.log * metrics.influx.uri -> metrics.influx.url * Unused arguments removed * async removed * promisify sendMetrics * Allow to disable prometheus metrics * Create test server with custom config * 'metrics-influx' resource removed * 'metrics-influx' resource removed * Private config schema flattened out * Extra code removed in Prometheus tests * promisify moved outside of the class * Do not throw errors from got in a specific test * hostnameAliases added * instanceIdFrom added * instanceIdEnvVarName added * envLabel added to schema * instanceMetadata is not used by InfluxMetrics * Instance metadata removed * hostnameAsAnInstanceId removed * A comment added * waitForExpect removed * Unused code removed
28 lines
1.1 KiB
JavaScript
28 lines
1.1 KiB
JavaScript
'use strict'
|
|
const groupBy = require('lodash.groupby')
|
|
|
|
function promClientJsonToInfluxV2(metrics, extraLabels = {}) {
|
|
// TODO Replace with Array.prototype.flatMap() after migrating to Node.js >= 11
|
|
const flatMap = (f, arr) => arr.reduce((acc, x) => acc.concat(f(x)), [])
|
|
return flatMap(metric => {
|
|
const valuesByLabels = groupBy(metric.values, value =>
|
|
JSON.stringify(Object.entries(value.labels).sort())
|
|
)
|
|
return Object.values(valuesByLabels).map(metricsWithSameLabel => {
|
|
const labels = Object.entries(metricsWithSameLabel[0].labels)
|
|
.concat(Object.entries(extraLabels))
|
|
.sort((a, b) => a[0].localeCompare(b[0]))
|
|
.map(labelEntry => `${labelEntry[0]}=${labelEntry[1]}`)
|
|
.join(',')
|
|
const labelsFormatted = labels ? `,${labels}` : ''
|
|
const values = metricsWithSameLabel
|
|
.sort((a, b) => a.metricName.localeCompare(b.metricName))
|
|
.map(value => `${value.metricName || metric.name}=${value.value}`)
|
|
.join(',')
|
|
return `prometheus${labelsFormatted} ${values}`
|
|
})
|
|
}, metrics).join('\n')
|
|
}
|
|
|
|
module.exports = { promClientJsonToInfluxV2 }
|