@doubret/inspector-elasticsearch
TypeScript icon, indicating that this package has built-in type declarations

2.0.0 • Public • Published

inspector-elasticsearch

Typescript Metrics Reporter for elasticsearch.

NPM Version License Build Status Dependencies Status

This library is made for inspector-metrics node module and is meant to be used with typescript / nodejs.
It uses elasticsearch-js as elasticsearch client.

install

npm install --save inspector-elasticsearch

basic usage

import { MetricRegistry } from "inspector-metrics";
import { ElasticsearchMetricReporter } from "inspector-elasticsearch";
import { ConfigOptions } from "elasticsearch";

const clientOptions: ConfigOptions = {
    apiVersion: "6.0",
    host: "localhost:9200",
};
// instance the elasticsearch reporter
const reporter: ElasticsearchMetricReporter = new ElasticsearchMetricReporter({
    clientOptions,
});
const registry: MetricRegistry = new MetricRegistry();

// add the registry to the reporter
reporter.addMetricRegistry(registry);
// start reporting
reporter.start();

determine the indexname for a metric

import { MetricRegistry } from "inspector-metrics";
import {
    ElasticsearchMetricReporter,
    MetricInfoDeterminator
} from "inspector-elasticsearch";
import { ConfigOptions } from "elasticsearch";

const clientOptions: ConfigOptions = { ... };
// computes the name of the index using the timestamp of the metric
const indexnameDeterminator: MetricInfoDeterminator = (
    registry: MetricRegistry,
    metric: Metric,
    type: MetricType,
    date: Date) => {
    
    const day = date.getDate();
    const dayPrefix: string = (day >= 10) ? "" : "0";
    const month = date.getMonth() + 1;
    const monthPrefix: string = (month >= 10) ? "" : "0";
    return `metrics-${date.getFullYear()}-${monthPrefix}${month}-${dayPrefix}${day}`;
};
// the indexname generator needs to be specified when instancing the reporter
const reporter: ElasticsearchMetricReporter = new ElasticsearchMetricReporter({
    clientOptions,
    indexnameDeterminator, 
}
);

build a metric document

import { MetricRegistry } from "inspector-metrics";
import {
    ElasticsearchMetricReporter,
    MetricDocumentBuilder,
    MetricType
} from "inspector-elasticsearch";
import { ConfigOptions } from "elasticsearch";

const clientOptions: ConfigOptions = { ... };
// only build documents for counter metrics
const metricDocumentBuilder: MetricDocumentBuilder = (
    registry: MetricRegistry,
    metric: Metric,
    type: MetricType,
    timestamp: Date,
    commonTags: Map<string, string>) => {

    if (metric instanceof Counter) {
        const tags = ElasticsearchMetricReporter.buildTags(commonTags, metric);
        const name = metric.getName();
        const group = metric.getGroup();
        return { name, group, tags, timestamp, values: { 'count': metric.getCount() }, type };

    } else {
        // null values will not be reported / published
        return null;
    }
};

// the document builder needs to be specified when instancing the reporter
const reporter: ElasticsearchMetricReporter = new ElasticsearchMetricReporter({
    clientOptions,
    metricDocumentBuilder,
});

dev

using the playground

To use the playground you need to have docker and docker-compose installed.

npm run compile
# running playground script
./playground.sh

view data in grafana

  1. Navigate to http://localhost:3000
  2. Add a new Data Source (type: elasticsearch, host / url: http://elasticsearch:9200)
  3. Create a new graph

view data in kibana

  1. Navigate to http://localhost:5601
  2. Add a new index pattern like metric-*
  3. Discover data

local dev

compile & test with different nodejs versions

build docker images:

docker-compose build

run tests:

docker-compose run node6
docker-compose run node7
docker-compose run node8
docker-compose run node9
docker-compose run node10

License

MIT

Package Sidebar

Install

npm i @doubret/inspector-elasticsearch

Weekly Downloads

2

Version

2.0.0

License

MIT

Unpacked Size

73.9 kB

Total Files

28

Last publish

Collaborators

  • doubret