Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
feat: support all metric types from otel spec
- Loading branch information
1 parent
646e2ea
commit 36a7c5f
Showing
8 changed files
with
133 additions
and
50 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
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 |
---|---|---|
@@ -1,10 +1,10 @@ | ||
import { createParamDecorator } from '@nestjs/common'; | ||
import { MetricOptions } from '@opentelemetry/api-metrics'; | ||
import { getOrCreateHistogram, MetricType } from '../metric-data'; | ||
import { getOrCreateHistogram } from '../metric-data'; | ||
|
||
export const OtelHistogram = createParamDecorator((name: string, options?: MetricOptions) => { | ||
if (!name || name.length === 0) { | ||
throw new Error('OtelHistogram need a name argument'); | ||
} | ||
return getOrCreateHistogram(name, MetricType.Histogram, options); | ||
return getOrCreateHistogram(name, options); | ||
}); |
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 |
---|---|---|
@@ -1,3 +1,4 @@ | ||
export * from './common'; | ||
export * from './counter'; | ||
export * from './histogram'; | ||
export * from './observable'; |
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,28 @@ | ||
import { createParamDecorator } from '@nestjs/common'; | ||
import { MetricOptions } from '@opentelemetry/api-metrics'; | ||
import { getOrCreateObservableCounter, getOrCreateObservableGauge, getOrCreateObservableUpDownCounter } from '../metric-data'; | ||
|
||
export const OtelObservableGauge = createParamDecorator((name: string, options?: MetricOptions) => { | ||
if (!name || name.length === 0) { | ||
throw new Error('OtelObservableGauge need a name argument'); | ||
} | ||
return getOrCreateObservableGauge(name, options); | ||
}); | ||
|
||
export const OtelObservableCounter = createParamDecorator( | ||
(name: string, options?: MetricOptions) => { | ||
if (!name || name.length === 0) { | ||
throw new Error('OtelObservableCounter need a name argument'); | ||
} | ||
return getOrCreateObservableCounter(name, options); | ||
}, | ||
); | ||
|
||
export const OtelObservableUpDownCounter = createParamDecorator( | ||
(name: string, options?: MetricOptions) => { | ||
if (!name || name.length === 0) { | ||
throw new Error('OtelObservableUpDownCounter need a name argument'); | ||
} | ||
return getOrCreateObservableUpDownCounter(name, options); | ||
}, | ||
); |
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 |
---|---|---|
@@ -1,60 +1,113 @@ | ||
import { | ||
Counter, MetricOptions, metrics, UpDownCounter, Histogram, | ||
Counter, MetricOptions, metrics, UpDownCounter, | ||
Histogram, ObservableGauge, ObservableCounter, ObservableUpDownCounter, | ||
} from '@opentelemetry/api-metrics'; | ||
import { OTEL_METER_NAME } from '../opentelemetry.constants'; | ||
|
||
export type GenericMetric = Counter | UpDownCounter | Histogram; | ||
export type GenericMetric = | ||
Counter | | ||
UpDownCounter | | ||
Histogram | | ||
ObservableGauge | | ||
ObservableCounter | | ||
ObservableUpDownCounter; | ||
|
||
export enum MetricType { | ||
'Counter' = 'Counter', | ||
'UpDownCounter' = 'UpDownCounter', | ||
'Histogram' = 'Histogram', | ||
'ObservableGauge' = 'ObservableGauge', | ||
'ObservableCounter' = 'ObservableCounter', | ||
'ObservableUpDownCounter' = 'ObservableUpDownCounter', | ||
} | ||
|
||
export const meterData: Map<string, GenericMetric> = new Map(); | ||
|
||
export function getOrCreateHistogram( | ||
name: string, | ||
type: MetricType, | ||
options: MetricOptions, | ||
): Histogram { | ||
if (meterData.has(name)) { | ||
return meterData.get(name) as Histogram; | ||
} | ||
|
||
const meter = metrics.getMeterProvider().getMeter(OTEL_METER_NAME); | ||
const histogram = meter.createHistogram(name, options); | ||
meterData.set(name, histogram); | ||
return histogram; | ||
} | ||
|
||
switch (type) { | ||
case MetricType.Histogram: | ||
const histogram = meter.createHistogram(name, options); | ||
meterData.set(name, histogram); | ||
return histogram; | ||
default: | ||
throw new Error(`Unknown type: ${type}`); | ||
export function getOrCreateCounter( | ||
name: string, | ||
options: MetricOptions, | ||
): Counter { | ||
if (meterData.has(name)) { | ||
return meterData.get(name) as Counter; | ||
} | ||
|
||
const meter = metrics.getMeterProvider().getMeter(OTEL_METER_NAME); | ||
|
||
const counter = meter.createCounter(name, options); | ||
meterData.set(name, counter); | ||
return counter; | ||
} | ||
|
||
export function getOrCreateCounter( | ||
export function getOrCreateUpDownCounter( | ||
name: string, | ||
type: MetricType, | ||
options: MetricOptions, | ||
): Counter | UpDownCounter { | ||
): UpDownCounter { | ||
if (meterData.has(name)) { | ||
return meterData.get(name) as Counter | UpDownCounter; | ||
return meterData.get(name) as UpDownCounter; | ||
} | ||
|
||
const meter = metrics.getMeterProvider().getMeter(OTEL_METER_NAME); | ||
|
||
switch (type) { | ||
case MetricType.Counter: | ||
const counter = meter.createCounter(name, options); | ||
meterData.set(name, counter); | ||
return counter; | ||
case MetricType.UpDownCounter: | ||
const upDownCounter = meter.createUpDownCounter(name, options); | ||
meterData.set(name, upDownCounter); | ||
return upDownCounter; | ||
default: | ||
throw new Error(`Unknown type: ${type}`); | ||
const upDownCounter = meter.createUpDownCounter(name, options); | ||
meterData.set(name, upDownCounter); | ||
return upDownCounter; | ||
} | ||
|
||
export function getOrCreateObservableGauge( | ||
name: string, | ||
options: MetricOptions, | ||
): ObservableGauge { | ||
if (meterData.has(name)) { | ||
return meterData.get(name) as ObservableGauge; | ||
} | ||
|
||
const meter = metrics.getMeterProvider().getMeter(OTEL_METER_NAME); | ||
|
||
const observableGauge = meter.createObservableGauge(name, options); | ||
meterData.set(name, observableGauge); | ||
return observableGauge; | ||
} | ||
|
||
export function getOrCreateObservableCounter( | ||
name: string, | ||
options: MetricOptions, | ||
): ObservableCounter { | ||
if (meterData.has(name)) { | ||
return meterData.get(name) as ObservableCounter; | ||
} | ||
|
||
const meter = metrics.getMeterProvider().getMeter(OTEL_METER_NAME); | ||
|
||
const observableCounter = meter.createObservableCounter(name, options); | ||
meterData.set(name, observableCounter); | ||
return observableCounter; | ||
} | ||
|
||
export function getOrCreateObservableUpDownCounter( | ||
name: string, | ||
options: MetricOptions, | ||
): ObservableUpDownCounter { | ||
if (meterData.has(name)) { | ||
return meterData.get(name) as ObservableUpDownCounter; | ||
} | ||
|
||
const meter = metrics.getMeterProvider().getMeter(OTEL_METER_NAME); | ||
|
||
const observableCounter = meter.createObservableCounter(name, options); | ||
meterData.set(name, observableCounter); | ||
return observableCounter; | ||
} |
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 |
---|---|---|
@@ -1,38 +1,36 @@ | ||
import { Injectable } from '@nestjs/common'; | ||
import { | ||
Counter, UpDownCounter, Histogram, MetricOptions, | ||
MetricOptions, | ||
} from '@opentelemetry/api-metrics'; | ||
import { | ||
getOrCreateCounter, getOrCreateHistogram, MetricType, | ||
getOrCreateCounter, getOrCreateHistogram, | ||
getOrCreateObservableCounter, getOrCreateObservableGauge, | ||
getOrCreateObservableUpDownCounter, getOrCreateUpDownCounter, MetricType, | ||
} from './metric-data'; | ||
|
||
@Injectable() | ||
export class MetricService { | ||
getCounter(name: string, options?: MetricOptions) { | ||
return this.getOrCreateCounter(name, MetricType.Counter, options); | ||
return getOrCreateCounter(name, options); | ||
} | ||
|
||
getUpDownCounter(name: string, options?: MetricOptions) { | ||
return this.getOrCreateCounter(name, MetricType.UpDownCounter, options); | ||
return getOrCreateUpDownCounter(name, options); | ||
} | ||
|
||
getHistogram(name: string, options?: MetricOptions) { | ||
return this.getOrCreateHistogram(name, MetricType.Histogram, options); | ||
return getOrCreateHistogram(name, options); | ||
} | ||
|
||
private getOrCreateHistogram( | ||
name: string, | ||
type: MetricType, | ||
options: MetricOptions, | ||
): Histogram { | ||
return getOrCreateHistogram(name, type, options); | ||
getObservableCounter(name: string, options?: MetricOptions) { | ||
return getOrCreateObservableCounter(name, options); | ||
} | ||
|
||
private getOrCreateCounter( | ||
name: string, | ||
type: MetricType, | ||
options: MetricOptions, | ||
): Counter | UpDownCounter { | ||
return getOrCreateCounter(name, type, options); | ||
getObservableGauge(name: string, options?: MetricOptions) { | ||
return getOrCreateObservableGauge(name, options); | ||
} | ||
|
||
getObservableUpDownCounter(name: string, options?: MetricOptions) { | ||
return getOrCreateObservableUpDownCounter(name, options); | ||
} | ||
} |