-
Notifications
You must be signed in to change notification settings - Fork 824
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' into http-sender
- Loading branch information
Showing
104 changed files
with
1,065 additions
and
682 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -115,37 +115,6 @@ browsers_unit_tests: &browsers_unit_tests | |
command: if [ "$CIRCLE_NODE_VERSION" = "v12" ]; then npm run codecov:browser; fi | ||
|
||
jobs: | ||
lint_&_docs: | ||
docker: | ||
- image: node:12 | ||
environment: | ||
NPM_CONFIG_UNSAFE_PERM: true | ||
steps: | ||
- checkout | ||
- run: | ||
name: Install minimal doc and lint modules globally | ||
command: npm i -g eslint@^6.8.0 eslint-plugin-node @typescript-eslint/eslint-plugin@^2.23.0 @typescript-eslint/parser@^2.23.0 eslint-plugin-header@^3.0.0 eslint-plugin-import@^2.19.1 eslint-plugin-prettier prettier lerna typedoc linkinator typescript@^3.7.2 | ||
- run: | ||
name: Install gts version 2.0.0 globally | ||
command: npm i -g [email protected] | ||
- run: | ||
name: Symlink global modules into all lerna packages | ||
command: lerna exec 'npm link eslint gts eslint-plugin-node @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-plugin-header eslint-plugin-import eslint-plugin-prettier prettier lerna typedoc linkinator typescript' | ||
- run: | ||
name: Check code style and linting | ||
command: npm run lint | ||
- run: | ||
name: Install doc dependencies | ||
command: lerna bootstrap --no-ci --scope @opentelemetry/api --include-filtered-dependencies -- --only dev | ||
- run: | ||
name: Docs tests | ||
command: npm run docs-test | ||
- run: | ||
name: Install minimal modules to lint examples | ||
command: npm i --no-save eslint eslint-plugin-import eslint-config-airbnb-base | ||
- run: | ||
name: Lint examples | ||
command: npm run lint:examples | ||
node8: | ||
docker: | ||
- image: node:8 | ||
|
@@ -161,11 +130,6 @@ jobs: | |
- image: node:12 | ||
environment: *node_test_env | ||
<<: *node_unit_tests | ||
node13: | ||
docker: | ||
- image: node:13 | ||
environment: *node_test_env | ||
<<: *node_unit_tests | ||
node14: | ||
docker: | ||
- image: node:14 | ||
|
@@ -180,14 +144,9 @@ workflows: | |
version: 2 | ||
build: | ||
jobs: | ||
- lint_&_docs: | ||
filters: | ||
branches: | ||
only: /.*/ | ||
- node8 | ||
- node10 | ||
- node12 | ||
- node13 | ||
- node14 | ||
- node12-browsers | ||
|
Validating CODEOWNERS rules …
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
name: Lint | ||
|
||
on: [push, pull_request] | ||
|
||
jobs: | ||
build: | ||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- uses: actions/checkout@v2 | ||
|
||
- name: restore lerna | ||
uses: actions/cache@master # must use unreleased master to cache multiple paths | ||
id: cache | ||
with: | ||
path: | | ||
node_modules | ||
packages/*/node_modules | ||
metapackages/*/node_modules | ||
key: ${{ runner.os }}-${{ hashFiles('**/package.json') }} | ||
|
||
- name: Bootstrap | ||
if: steps.cache.outputs.cache-hit != 'true' | ||
run: | | ||
npm install --only=dev --ignore-scripts | ||
npx lerna bootstrap --no-ci --ignore-scripts -- --only=dev | ||
- name: Lint | ||
run: | | ||
npm run lint | ||
npm run lint:examples | ||
- name: Install and Build API Dependencies | ||
run: npx lerna bootstrap --no-ci --scope @opentelemetry/api --include-filtered-dependencies | ||
|
||
- name: Test Docs | ||
run: npm run docs-test |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
# Batcher API Guide | ||
|
||
[The batcher](https://github.com/open-telemetry/opentelemetry-js/blob/master/packages/opentelemetry-metrics/src/export/Batcher.ts?rgh-link-date=2020-05-25T18%3A43%3A57Z) has two responsibilities: choosing which aggregator to choose for a metric instrument and store the last record for each metric ready to be exported. | ||
|
||
## Selecting a specific aggregator for metrics | ||
|
||
Sometimes you may want to use a specific aggregator for one of your metric, export an average of the last X values instead of just the last one. | ||
|
||
Here is what an aggregator that does that would look like: | ||
```ts | ||
import { Aggregator } from '@opentelemetry/metrics'; | ||
import { hrTime } from '@opentelemetry/core'; | ||
|
||
export class AverageAggregator implements Aggregator { | ||
|
||
private _values: number[] = []; | ||
private _limit: number; | ||
|
||
constructor (limit?: number) { | ||
this._limit = limit ?? 10; | ||
} | ||
|
||
update (value: number) { | ||
this._values.push(value); | ||
if (this._values.length >= this._limit) { | ||
this._values = this._values.slice(0, 10); | ||
} | ||
} | ||
|
||
toPoint() { | ||
const sum =this._values.reduce((agg, value) => { | ||
agg += value; | ||
return agg; | ||
}, 0); | ||
return { | ||
value: this._values.length > 0 ? sum / this._values.length : 0, | ||
timestamp: hrTime(), | ||
} | ||
} | ||
} | ||
``` | ||
|
||
Now we will need to implement our own batcher to configure the sdk to use our new aggregator. To simplify even more, we will just extend the `UngroupedBatcher` (which is the default) to avoid re-implementing the whole `Aggregator` interface. | ||
|
||
Here the result: | ||
```ts | ||
import { | ||
UngroupedBatcher, | ||
MetricDescriptor, | ||
CounterSumAggregator, | ||
ObserverAggregator, | ||
MeasureExactAggregator, | ||
} from '@opentelemetry/metrics'; | ||
|
||
export class CustomBatcher extends UngroupedBatcher { | ||
aggregatorFor (metricDescriptor: MetricDescriptor) { | ||
if (metricDescriptor.labels === 'metricToBeAveraged') { | ||
return new AverageAggregator(10); | ||
} | ||
// this is exactly what the "UngroupedBatcher" does, we will re-use it | ||
// to fallback on the default behavior | ||
switch (metricDescriptor.metricKind) { | ||
case MetricKind.COUNTER: | ||
return new CounterSumAggregator(); | ||
case MetricKind.OBSERVER: | ||
return new ObserverAggregator(); | ||
default: | ||
return new MeasureExactAggregator(); | ||
} | ||
} | ||
} | ||
``` | ||
|
||
Finally, we need to specify to the `MeterProvider` to use our `CustomBatcher` when creating new meter: | ||
|
||
```ts | ||
import { | ||
UngroupedBatcher, | ||
MetricDescriptor, | ||
CounterSumAggregator, | ||
ObserverAggregator, | ||
MeasureExactAggregator, | ||
MeterProvider, | ||
Aggregator, | ||
} from '@opentelemetry/metrics'; | ||
import { hrTime } from '@opentelemetry/core'; | ||
|
||
export class AverageAggregator implements Aggregator { | ||
|
||
private _values: number[] = []; | ||
private _limit: number; | ||
|
||
constructor (limit?: number) { | ||
this._limit = limit ?? 10; | ||
} | ||
|
||
update (value: number) { | ||
this._values.push(value); | ||
if (this._values.length >= this._limit) { | ||
this._values = this._values.slice(0, 10); | ||
} | ||
} | ||
|
||
toPoint() { | ||
const sum =this._values.reduce((agg, value) => { | ||
agg += value; | ||
return agg; | ||
}, 0); | ||
return { | ||
value: this._values.length > 0 ? sum / this._values.length : 0, | ||
timestamp: hrTime(), | ||
} | ||
} | ||
} | ||
|
||
export class CustomBatcher extends UngroupedBatcher { | ||
aggregatorFor (metricDescriptor: MetricDescriptor) { | ||
if (metricDescriptor.name === 'requests') { | ||
return new AverageAggregator(10); | ||
} | ||
// this is exactly what the "UngroupedBatcher" does, we will re-use it | ||
// to fallback on the default behavior | ||
switch (metricDescriptor.metricKind) { | ||
case MetricKind.COUNTER: | ||
return new CounterSumAggregator(); | ||
case MetricKind.OBSERVER: | ||
return new ObserverAggregator(); | ||
default: | ||
return new MeasureExactAggregator(); | ||
} | ||
} | ||
} | ||
|
||
const meter = new MeterProvider({ | ||
batcher: new CustomBatcher(), | ||
interval: 1000, | ||
}).getMeter('example-custom-batcher'); | ||
|
||
const requestsLatency = meter.createMeasure('requests', { | ||
monotonic: true, | ||
description: 'Average latency' | ||
}); | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.