// test-metrics.ts
import { Metric, Effect, Console, Layer } from 'effect'
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'
import { NodeSdk } from '@effect/opentelemetry'
import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'
const NodeSdkLive = Layer.unwrapEffect(
Effect.gen(function* ($) {
const metricExporter = new OTLPMetricExporter({
url: 'http://127.0.0.1:9090/api/v1/otlp/v1/metrics',
})
return NodeSdk.layer(() => ({
resource: {
serviceName: 'nextjs',
},
metricReader: new PeriodicExportingMetricReader({
exporter: metricExporter,
exportIntervalMillis: 1000,
}),
}))
}),
)
// Create a counter named 'task_count' and increment it by 1 every time it's invoked
const taskCount = Metric.counter('task_count').pipe(Metric.withConstantInput(1))
const task1 = Effect.succeed(1).pipe(Effect.delay('100 millis'))
const task2 = Effect.succeed(2).pipe(Effect.delay('200 millis'))
const program = Effect.gen(function* (_) {
const a = yield* _(taskCount(task1))
const b = yield* _(taskCount(task2))
return a + b
})
// const showMetric = Metric.value(taskCount).pipe(Effect.flatMap(Console.log))
Effect.runPromise(program.pipe(Effect.provide(NodeSdkLive))).then(console.log)
// test-metrics.ts
import { Metric, Effect, Console, Layer } from 'effect'
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'
import { NodeSdk } from '@effect/opentelemetry'
import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'
const NodeSdkLive = Layer.unwrapEffect(
Effect.gen(function* ($) {
const metricExporter = new OTLPMetricExporter({
url: 'http://127.0.0.1:9090/api/v1/otlp/v1/metrics',
})
return NodeSdk.layer(() => ({
resource: {
serviceName: 'nextjs',
},
metricReader: new PeriodicExportingMetricReader({
exporter: metricExporter,
exportIntervalMillis: 1000,
}),
}))
}),
)
// Create a counter named 'task_count' and increment it by 1 every time it's invoked
const taskCount = Metric.counter('task_count').pipe(Metric.withConstantInput(1))
const task1 = Effect.succeed(1).pipe(Effect.delay('100 millis'))
const task2 = Effect.succeed(2).pipe(Effect.delay('200 millis'))
const program = Effect.gen(function* (_) {
const a = yield* _(taskCount(task1))
const b = yield* _(taskCount(task2))
return a + b
})
// const showMetric = Metric.value(taskCount).pipe(Effect.flatMap(Console.log))
Effect.runPromise(program.pipe(Effect.provide(NodeSdkLive))).then(console.log)