1010import {
1111 trace ,
1212 context ,
13+ metrics ,
1314 propagation ,
1415 createContextKey ,
1516 SpanStatusCode ,
1617 type Span ,
17- type Context
18+ type Context ,
19+ type MetricOptions
1820} from '@opentelemetry/api'
1921
2022import { Config } from '@athenna/config'
@@ -202,6 +204,18 @@ export class OtelImpl extends Macroable {
202204 return propagation
203205 }
204206
207+ /**
208+ * Get the metrics API from the OpenTelemetry SDK.
209+ *
210+ * @example
211+ * ```ts
212+ * const meter = Otel.metrics.getMeter('@athenna/otel')
213+ * ```
214+ */
215+ public get metrics ( ) {
216+ return metrics
217+ }
218+
205219 /**
206220 * Get the symbol for the current context bag.
207221 *
@@ -214,6 +228,90 @@ export class OtelImpl extends Macroable {
214228 return otelCurrentContextBagKey
215229 }
216230
231+ /**
232+ * Create a counter metric.
233+ *
234+ * @example
235+ * ```ts
236+ * const counter = Otel.createCounter('my.counter')
237+ * ```
238+ */
239+ public createCounter ( name : string , options ?: MetricOptions ) {
240+ return metrics . getMeter ( '@athenna/otel' ) . createCounter ( name , options )
241+ }
242+
243+ /**
244+ * Create a gauge metric.
245+ *
246+ * @example
247+ * ```ts
248+ * const gauge = Otel.createGauge('my.gauge')
249+ * ```
250+ */
251+ public createGauge ( name : string , options ?: MetricOptions ) {
252+ return metrics . getMeter ( '@athenna/otel' ) . createGauge ( name , options )
253+ }
254+
255+ /**
256+ * Create a histogram metric.
257+ *
258+ * @example
259+ * ```ts
260+ * const histogram = Otel.createHistogram('my.histogram')
261+ * ```
262+ */
263+ public createHistogram ( name : string , options ?: MetricOptions ) {
264+ return metrics . getMeter ( '@athenna/otel' ) . createHistogram ( name , options )
265+ }
266+
267+ /**
268+ * Create an up-down counter metric.
269+ *
270+ * @example
271+ * ```ts
272+ * const upDownCounter = Otel.createUpDownCounter('my.upDownCounter')
273+ * ```
274+ */
275+ public createUpDownCounter ( name : string , options ?: MetricOptions ) {
276+ return metrics . getMeter ( '@athenna/otel' ) . createUpDownCounter ( name , options )
277+ }
278+
279+ /**
280+ * Create an observable counter metric.
281+ *
282+ * @example
283+ * ```ts
284+ * const observableCounter = Otel.createObservableCounter('my.observableCounter')
285+ * ```
286+ */
287+ public createObservableCounter ( name : string , options ?: MetricOptions ) {
288+ return metrics . getMeter ( '@athenna/otel' ) . createObservableCounter ( name , options )
289+ }
290+
291+ /**
292+ * Create an observable gauge metric.
293+ *
294+ * @example
295+ * ```ts
296+ * const observableGauge = Otel.createObservableGauge('my.observableGauge')
297+ * ```
298+ */
299+ public createObservableGauge ( name : string , options ?: MetricOptions ) {
300+ return metrics . getMeter ( '@athenna/otel' ) . createObservableGauge ( name , options )
301+ }
302+
303+ /**
304+ * Create an observable up-down counter metric.
305+ *
306+ * @example
307+ * ```ts
308+ * const observableUpDownCounter = Otel.createObservableUpDownCounter('my.observableUpDownCounter')
309+ * ```
310+ */
311+ public createObservableUpDownCounter ( name : string , options ?: MetricOptions ) {
312+ return metrics . getMeter ( '@athenna/otel' ) . createObservableUpDownCounter ( name , options )
313+ }
314+
217315 /**
218316 * Create a custom OpenTelemetry context key.
219317 *
0 commit comments