@effect/opentelemetry 0.60.0 → 4.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/dist/{dts/Logger.d.ts → Logger.d.ts} +19 -13
- package/dist/Logger.d.ts.map +1 -0
- package/dist/Logger.js +76 -0
- package/dist/Logger.js.map +1 -0
- package/dist/Metrics.d.ts +76 -0
- package/dist/Metrics.d.ts.map +1 -0
- package/dist/Metrics.js +59 -0
- package/dist/Metrics.js.map +1 -0
- package/dist/{dts/NodeSdk.d.ts → NodeSdk.d.ts} +12 -9
- package/dist/NodeSdk.d.ts.map +1 -0
- package/dist/{esm/NodeSdk.js → NodeSdk.js} +23 -14
- package/dist/NodeSdk.js.map +1 -0
- package/dist/{dts/Resource.d.ts → Resource.d.ts} +10 -13
- package/dist/Resource.d.ts.map +1 -0
- package/dist/{esm/Resource.js → Resource.js} +12 -13
- package/dist/Resource.js.map +1 -0
- package/dist/Tracer.d.ts +129 -0
- package/dist/Tracer.d.ts.map +1 -0
- package/dist/Tracer.js +391 -0
- package/dist/Tracer.js.map +1 -0
- package/dist/{dts/WebSdk.d.ts → WebSdk.d.ts} +12 -9
- package/dist/WebSdk.d.ts.map +1 -0
- package/dist/WebSdk.js +41 -0
- package/dist/WebSdk.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/{esm/index.js → index.js} +4 -20
- package/dist/index.js.map +1 -0
- package/dist/internal/attributes.d.ts +2 -0
- package/dist/internal/attributes.d.ts.map +1 -0
- package/dist/internal/attributes.js +19 -0
- package/dist/internal/attributes.js.map +1 -0
- package/dist/{dts/internal → internal}/metrics.d.ts.map +1 -1
- package/dist/internal/metrics.js +406 -0
- package/dist/internal/metrics.js.map +1 -0
- package/dist/internal/utilities.d.ts +2 -0
- package/dist/internal/utilities.d.ts.map +1 -0
- package/dist/internal/utilities.js +3 -0
- package/dist/internal/utilities.js.map +1 -0
- package/package.json +70 -118
- package/src/Logger.ts +52 -55
- package/src/Metrics.ts +92 -18
- package/src/NodeSdk.ts +67 -64
- package/src/Resource.ts +16 -24
- package/src/Tracer.ts +469 -78
- package/src/WebSdk.ts +59 -51
- package/src/index.ts +7 -26
- package/src/internal/attributes.ts +21 -0
- package/src/internal/metrics.ts +381 -250
- package/src/internal/utilities.ts +5 -0
- package/Logger/package.json +0 -6
- package/Metrics/package.json +0 -6
- package/NodeSdk/package.json +0 -6
- package/Otlp/package.json +0 -6
- package/OtlpLogger/package.json +0 -6
- package/OtlpMetrics/package.json +0 -6
- package/OtlpResource/package.json +0 -6
- package/OtlpTracer/package.json +0 -6
- package/Resource/package.json +0 -6
- package/Tracer/package.json +0 -6
- package/WebSdk/package.json +0 -6
- package/dist/cjs/Logger.js +0 -85
- package/dist/cjs/Logger.js.map +0 -1
- package/dist/cjs/Metrics.js +0 -24
- package/dist/cjs/Metrics.js.map +0 -1
- package/dist/cjs/NodeSdk.js +0 -53
- package/dist/cjs/NodeSdk.js.map +0 -1
- package/dist/cjs/Otlp.js +0 -46
- package/dist/cjs/Otlp.js.map +0 -1
- package/dist/cjs/OtlpLogger.js +0 -158
- package/dist/cjs/OtlpLogger.js.map +0 -1
- package/dist/cjs/OtlpMetrics.js +0 -354
- package/dist/cjs/OtlpMetrics.js.map +0 -1
- package/dist/cjs/OtlpResource.js +0 -136
- package/dist/cjs/OtlpResource.js.map +0 -1
- package/dist/cjs/OtlpTracer.js +0 -229
- package/dist/cjs/OtlpTracer.js.map +0 -1
- package/dist/cjs/Resource.js +0 -75
- package/dist/cjs/Resource.js.map +0 -1
- package/dist/cjs/Tracer.js +0 -87
- package/dist/cjs/Tracer.js.map +0 -1
- package/dist/cjs/WebSdk.js +0 -42
- package/dist/cjs/WebSdk.js.map +0 -1
- package/dist/cjs/index.js +0 -30
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/internal/metrics.js +0 -288
- package/dist/cjs/internal/metrics.js.map +0 -1
- package/dist/cjs/internal/otlpExporter.js +0 -81
- package/dist/cjs/internal/otlpExporter.js.map +0 -1
- package/dist/cjs/internal/tracer.js +0 -299
- package/dist/cjs/internal/tracer.js.map +0 -1
- package/dist/cjs/internal/utils.js +0 -34
- package/dist/cjs/internal/utils.js.map +0 -1
- package/dist/dts/Logger.d.ts.map +0 -1
- package/dist/dts/Metrics.d.ts +0 -29
- package/dist/dts/Metrics.d.ts.map +0 -1
- package/dist/dts/NodeSdk.d.ts.map +0 -1
- package/dist/dts/Otlp.d.ts +0 -31
- package/dist/dts/Otlp.d.ts.map +0 -1
- package/dist/dts/OtlpLogger.d.ts +0 -46
- package/dist/dts/OtlpLogger.d.ts.map +0 -1
- package/dist/dts/OtlpMetrics.d.ts +0 -40
- package/dist/dts/OtlpMetrics.d.ts.map +0 -1
- package/dist/dts/OtlpResource.d.ts +0 -104
- package/dist/dts/OtlpResource.d.ts.map +0 -1
- package/dist/dts/OtlpTracer.d.ts +0 -49
- package/dist/dts/OtlpTracer.d.ts.map +0 -1
- package/dist/dts/Resource.d.ts.map +0 -1
- package/dist/dts/Tracer.d.ts +0 -143
- package/dist/dts/Tracer.d.ts.map +0 -1
- package/dist/dts/WebSdk.d.ts.map +0 -1
- package/dist/dts/index.d.ts +0 -45
- package/dist/dts/index.d.ts.map +0 -1
- package/dist/dts/internal/otlpExporter.d.ts +0 -2
- package/dist/dts/internal/otlpExporter.d.ts.map +0 -1
- package/dist/dts/internal/tracer.d.ts +0 -2
- package/dist/dts/internal/tracer.d.ts.map +0 -1
- package/dist/dts/internal/utils.d.ts +0 -2
- package/dist/dts/internal/utils.d.ts.map +0 -1
- package/dist/esm/Logger.js +0 -75
- package/dist/esm/Logger.js.map +0 -1
- package/dist/esm/Metrics.js +0 -17
- package/dist/esm/Metrics.js.map +0 -1
- package/dist/esm/NodeSdk.js.map +0 -1
- package/dist/esm/Otlp.js +0 -38
- package/dist/esm/Otlp.js.map +0 -1
- package/dist/esm/OtlpLogger.js +0 -150
- package/dist/esm/OtlpLogger.js.map +0 -1
- package/dist/esm/OtlpMetrics.js +0 -346
- package/dist/esm/OtlpMetrics.js.map +0 -1
- package/dist/esm/OtlpResource.js +0 -124
- package/dist/esm/OtlpResource.js.map +0 -1
- package/dist/esm/OtlpTracer.js +0 -221
- package/dist/esm/OtlpTracer.js.map +0 -1
- package/dist/esm/Resource.js.map +0 -1
- package/dist/esm/Tracer.js +0 -80
- package/dist/esm/Tracer.js.map +0 -1
- package/dist/esm/WebSdk.js +0 -33
- package/dist/esm/WebSdk.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/internal/metrics.js +0 -278
- package/dist/esm/internal/metrics.js.map +0 -1
- package/dist/esm/internal/otlpExporter.js +0 -74
- package/dist/esm/internal/otlpExporter.js.map +0 -1
- package/dist/esm/internal/tracer.js +0 -290
- package/dist/esm/internal/tracer.js.map +0 -1
- package/dist/esm/internal/utils.js +0 -23
- package/dist/esm/internal/utils.js.map +0 -1
- package/dist/esm/package.json +0 -4
- package/index/package.json +0 -6
- package/src/Otlp.ts +0 -66
- package/src/OtlpLogger.ts +0 -258
- package/src/OtlpMetrics.ts +0 -571
- package/src/OtlpResource.ts +0 -232
- package/src/OtlpTracer.ts +0 -349
- package/src/internal/otlpExporter.ts +0 -124
- package/src/internal/tracer.ts +0 -437
- package/src/internal/utils.ts +0 -31
- /package/dist/{dts/internal → internal}/metrics.d.ts +0 -0
package/package.json
CHANGED
|
@@ -1,15 +1,58 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/opentelemetry",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "4.0.0-beta.0",
|
|
5
5
|
"license": "MIT",
|
|
6
|
+
"description": "OpenTelemetry integration for Effect",
|
|
7
|
+
"homepage": "https://effect.website",
|
|
6
8
|
"repository": {
|
|
7
9
|
"type": "git",
|
|
8
|
-
"url": "https://github.com/Effect-TS/effect.git",
|
|
10
|
+
"url": "https://github.com/Effect-TS/effect-smol.git",
|
|
9
11
|
"directory": "packages/opentelemetry"
|
|
10
12
|
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/Effect-TS/effect-smol/issues"
|
|
15
|
+
},
|
|
16
|
+
"tags": [
|
|
17
|
+
"opentelemetry",
|
|
18
|
+
"observability",
|
|
19
|
+
"tracing",
|
|
20
|
+
"metrics",
|
|
21
|
+
"typescript",
|
|
22
|
+
"algebraic-data-types",
|
|
23
|
+
"functional-programming"
|
|
24
|
+
],
|
|
25
|
+
"keywords": [
|
|
26
|
+
"opentelemetry",
|
|
27
|
+
"observability",
|
|
28
|
+
"tracing",
|
|
29
|
+
"metrics",
|
|
30
|
+
"typescript",
|
|
31
|
+
"algebraic-data-types",
|
|
32
|
+
"functional-programming"
|
|
33
|
+
],
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=18.0.0"
|
|
36
|
+
},
|
|
11
37
|
"sideEffects": [],
|
|
12
|
-
"
|
|
38
|
+
"exports": {
|
|
39
|
+
"./package.json": "./package.json",
|
|
40
|
+
".": "./dist/index.js",
|
|
41
|
+
"./*": "./dist/*.js",
|
|
42
|
+
"./internal/*": null,
|
|
43
|
+
"./*/index": null
|
|
44
|
+
},
|
|
45
|
+
"files": [
|
|
46
|
+
"src/**/*.ts",
|
|
47
|
+
"dist/**/*.js",
|
|
48
|
+
"dist/**/*.js.map",
|
|
49
|
+
"dist/**/*.d.ts",
|
|
50
|
+
"dist/**/*.d.ts.map"
|
|
51
|
+
],
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public",
|
|
54
|
+
"provenance": true
|
|
55
|
+
},
|
|
13
56
|
"peerDependencies": {
|
|
14
57
|
"@opentelemetry/api": "^1.9",
|
|
15
58
|
"@opentelemetry/resources": "^2.0.0",
|
|
@@ -19,8 +62,7 @@
|
|
|
19
62
|
"@opentelemetry/sdk-trace-node": "^2.0.0",
|
|
20
63
|
"@opentelemetry/sdk-trace-web": "^2.0.0",
|
|
21
64
|
"@opentelemetry/semantic-conventions": "^1.33.0",
|
|
22
|
-
"
|
|
23
|
-
"effect": "^3.19.13"
|
|
65
|
+
"effect": "^4.0.0-beta.0"
|
|
24
66
|
},
|
|
25
67
|
"peerDependenciesMeta": {
|
|
26
68
|
"@opentelemetry/api": {
|
|
@@ -45,118 +87,28 @@
|
|
|
45
87
|
"optional": true
|
|
46
88
|
}
|
|
47
89
|
},
|
|
48
|
-
"
|
|
49
|
-
"
|
|
90
|
+
"devDependencies": {
|
|
91
|
+
"@opentelemetry/api": "^1.9.0",
|
|
92
|
+
"@opentelemetry/context-async-hooks": "^2.5.0",
|
|
93
|
+
"@opentelemetry/exporter-metrics-otlp-http": "0.211.0",
|
|
94
|
+
"@opentelemetry/exporter-prometheus": "^0.211.0",
|
|
95
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.211.0",
|
|
96
|
+
"@opentelemetry/otlp-exporter-base": "^0.211.0",
|
|
97
|
+
"@opentelemetry/resources": "^2.5.0",
|
|
98
|
+
"@opentelemetry/sdk-logs": "^0.211.0",
|
|
99
|
+
"@opentelemetry/sdk-metrics": "^2.5.0",
|
|
100
|
+
"@opentelemetry/sdk-trace-base": "^2.5.0",
|
|
101
|
+
"@opentelemetry/sdk-trace-node": "^2.5.0",
|
|
102
|
+
"@opentelemetry/sdk-trace-web": "^2.5.0",
|
|
103
|
+
"@opentelemetry/semantic-conventions": "^1.39.0"
|
|
50
104
|
},
|
|
51
|
-
"
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
"default": "./dist/cjs/index.js"
|
|
60
|
-
},
|
|
61
|
-
"./Logger": {
|
|
62
|
-
"types": "./dist/dts/Logger.d.ts",
|
|
63
|
-
"import": "./dist/esm/Logger.js",
|
|
64
|
-
"default": "./dist/cjs/Logger.js"
|
|
65
|
-
},
|
|
66
|
-
"./Metrics": {
|
|
67
|
-
"types": "./dist/dts/Metrics.d.ts",
|
|
68
|
-
"import": "./dist/esm/Metrics.js",
|
|
69
|
-
"default": "./dist/cjs/Metrics.js"
|
|
70
|
-
},
|
|
71
|
-
"./NodeSdk": {
|
|
72
|
-
"types": "./dist/dts/NodeSdk.d.ts",
|
|
73
|
-
"import": "./dist/esm/NodeSdk.js",
|
|
74
|
-
"default": "./dist/cjs/NodeSdk.js"
|
|
75
|
-
},
|
|
76
|
-
"./Otlp": {
|
|
77
|
-
"types": "./dist/dts/Otlp.d.ts",
|
|
78
|
-
"import": "./dist/esm/Otlp.js",
|
|
79
|
-
"default": "./dist/cjs/Otlp.js"
|
|
80
|
-
},
|
|
81
|
-
"./OtlpLogger": {
|
|
82
|
-
"types": "./dist/dts/OtlpLogger.d.ts",
|
|
83
|
-
"import": "./dist/esm/OtlpLogger.js",
|
|
84
|
-
"default": "./dist/cjs/OtlpLogger.js"
|
|
85
|
-
},
|
|
86
|
-
"./OtlpMetrics": {
|
|
87
|
-
"types": "./dist/dts/OtlpMetrics.d.ts",
|
|
88
|
-
"import": "./dist/esm/OtlpMetrics.js",
|
|
89
|
-
"default": "./dist/cjs/OtlpMetrics.js"
|
|
90
|
-
},
|
|
91
|
-
"./OtlpResource": {
|
|
92
|
-
"types": "./dist/dts/OtlpResource.d.ts",
|
|
93
|
-
"import": "./dist/esm/OtlpResource.js",
|
|
94
|
-
"default": "./dist/cjs/OtlpResource.js"
|
|
95
|
-
},
|
|
96
|
-
"./OtlpTracer": {
|
|
97
|
-
"types": "./dist/dts/OtlpTracer.d.ts",
|
|
98
|
-
"import": "./dist/esm/OtlpTracer.js",
|
|
99
|
-
"default": "./dist/cjs/OtlpTracer.js"
|
|
100
|
-
},
|
|
101
|
-
"./Resource": {
|
|
102
|
-
"types": "./dist/dts/Resource.d.ts",
|
|
103
|
-
"import": "./dist/esm/Resource.js",
|
|
104
|
-
"default": "./dist/cjs/Resource.js"
|
|
105
|
-
},
|
|
106
|
-
"./Tracer": {
|
|
107
|
-
"types": "./dist/dts/Tracer.d.ts",
|
|
108
|
-
"import": "./dist/esm/Tracer.js",
|
|
109
|
-
"default": "./dist/cjs/Tracer.js"
|
|
110
|
-
},
|
|
111
|
-
"./WebSdk": {
|
|
112
|
-
"types": "./dist/dts/WebSdk.d.ts",
|
|
113
|
-
"import": "./dist/esm/WebSdk.js",
|
|
114
|
-
"default": "./dist/cjs/WebSdk.js"
|
|
115
|
-
},
|
|
116
|
-
"./index": {
|
|
117
|
-
"types": "./dist/dts/index.d.ts",
|
|
118
|
-
"import": "./dist/esm/index.js",
|
|
119
|
-
"default": "./dist/cjs/index.js"
|
|
120
|
-
}
|
|
121
|
-
},
|
|
122
|
-
"typesVersions": {
|
|
123
|
-
"*": {
|
|
124
|
-
"Logger": [
|
|
125
|
-
"./dist/dts/Logger.d.ts"
|
|
126
|
-
],
|
|
127
|
-
"Metrics": [
|
|
128
|
-
"./dist/dts/Metrics.d.ts"
|
|
129
|
-
],
|
|
130
|
-
"NodeSdk": [
|
|
131
|
-
"./dist/dts/NodeSdk.d.ts"
|
|
132
|
-
],
|
|
133
|
-
"Otlp": [
|
|
134
|
-
"./dist/dts/Otlp.d.ts"
|
|
135
|
-
],
|
|
136
|
-
"OtlpLogger": [
|
|
137
|
-
"./dist/dts/OtlpLogger.d.ts"
|
|
138
|
-
],
|
|
139
|
-
"OtlpMetrics": [
|
|
140
|
-
"./dist/dts/OtlpMetrics.d.ts"
|
|
141
|
-
],
|
|
142
|
-
"OtlpResource": [
|
|
143
|
-
"./dist/dts/OtlpResource.d.ts"
|
|
144
|
-
],
|
|
145
|
-
"OtlpTracer": [
|
|
146
|
-
"./dist/dts/OtlpTracer.d.ts"
|
|
147
|
-
],
|
|
148
|
-
"Resource": [
|
|
149
|
-
"./dist/dts/Resource.d.ts"
|
|
150
|
-
],
|
|
151
|
-
"Tracer": [
|
|
152
|
-
"./dist/dts/Tracer.d.ts"
|
|
153
|
-
],
|
|
154
|
-
"WebSdk": [
|
|
155
|
-
"./dist/dts/WebSdk.d.ts"
|
|
156
|
-
],
|
|
157
|
-
"index": [
|
|
158
|
-
"./dist/dts/index.d.ts"
|
|
159
|
-
]
|
|
160
|
-
}
|
|
105
|
+
"scripts": {
|
|
106
|
+
"codegen": "effect-utils codegen",
|
|
107
|
+
"build": "tsc -b tsconfig.json && pnpm babel",
|
|
108
|
+
"build:tsgo": "tsgo -b tsconfig.json && pnpm babel",
|
|
109
|
+
"babel": "babel dist --plugins annotate-pure-calls --out-dir dist --source-maps",
|
|
110
|
+
"check": "tsc -b tsconfig.json",
|
|
111
|
+
"test": "vitest",
|
|
112
|
+
"coverage": "vitest --coverage"
|
|
161
113
|
}
|
|
162
114
|
}
|
package/src/Logger.ts
CHANGED
|
@@ -4,30 +4,30 @@
|
|
|
4
4
|
import * as Otel from "@opentelemetry/sdk-logs"
|
|
5
5
|
import type { NonEmptyReadonlyArray } from "effect/Array"
|
|
6
6
|
import * as Arr from "effect/Array"
|
|
7
|
-
import * as
|
|
7
|
+
import * as Clock from "effect/Clock"
|
|
8
8
|
import type { DurationInput } from "effect/Duration"
|
|
9
9
|
import * as Effect from "effect/Effect"
|
|
10
|
-
import * as FiberId from "effect/FiberId"
|
|
11
|
-
import * as FiberRef from "effect/FiberRef"
|
|
12
|
-
import * as FiberRefs from "effect/FiberRefs"
|
|
13
10
|
import * as Layer from "effect/Layer"
|
|
14
11
|
import * as Logger from "effect/Logger"
|
|
12
|
+
import * as LogLevel from "effect/LogLevel"
|
|
13
|
+
import * as Predicate from "effect/Predicate"
|
|
14
|
+
import * as ServiceMap from "effect/ServiceMap"
|
|
15
15
|
import * as Tracer from "effect/Tracer"
|
|
16
|
-
import { unknownToAttributeValue } from "./internal/
|
|
17
|
-
import { Resource } from "./Resource.
|
|
16
|
+
import { unknownToAttributeValue } from "./internal/attributes.ts"
|
|
17
|
+
import { Resource } from "./Resource.ts"
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* @since 1.0.0
|
|
21
|
-
* @category
|
|
21
|
+
* @category Services
|
|
22
22
|
*/
|
|
23
|
-
export class OtelLoggerProvider extends
|
|
23
|
+
export class OtelLoggerProvider extends ServiceMap.Service<
|
|
24
24
|
OtelLoggerProvider,
|
|
25
25
|
Otel.LoggerProvider
|
|
26
|
-
>() {}
|
|
26
|
+
>()("@effect/opentelemetry/Logger/OtelLoggerProvider") {}
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* @since 1.0.0
|
|
30
|
-
* @category
|
|
30
|
+
* @category Constructors
|
|
31
31
|
*/
|
|
32
32
|
export const make: Effect.Effect<
|
|
33
33
|
Logger.Logger<unknown, void>,
|
|
@@ -35,40 +35,37 @@ export const make: Effect.Effect<
|
|
|
35
35
|
OtelLoggerProvider
|
|
36
36
|
> = Effect.gen(function*() {
|
|
37
37
|
const loggerProvider = yield* OtelLoggerProvider
|
|
38
|
-
const clock = yield*
|
|
38
|
+
const clock = yield* Clock.Clock
|
|
39
39
|
const otelLogger = loggerProvider.getLogger("@effect/opentelemetry")
|
|
40
40
|
|
|
41
41
|
return Logger.make((options) => {
|
|
42
|
-
const now = options.date.getTime()
|
|
43
|
-
|
|
44
42
|
const attributes: Record<string, any> = {
|
|
45
|
-
fiberId:
|
|
43
|
+
fiberId: options.fiber.id
|
|
46
44
|
}
|
|
47
45
|
|
|
48
|
-
const
|
|
49
|
-
FiberRefs.getOrDefault(options.context, FiberRef.currentContext),
|
|
50
|
-
Tracer.ParentSpan
|
|
51
|
-
)
|
|
46
|
+
const span = ServiceMap.getOrUndefined(options.fiber.services, Tracer.ParentSpan)
|
|
52
47
|
|
|
53
|
-
if (
|
|
54
|
-
attributes.spanId =
|
|
55
|
-
attributes.traceId =
|
|
48
|
+
if (Predicate.isNotUndefined(span)) {
|
|
49
|
+
attributes.spanId = span.spanId
|
|
50
|
+
attributes.traceId = span.traceId
|
|
56
51
|
}
|
|
57
52
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
53
|
+
// TODO: add back after log spans / annotations
|
|
54
|
+
// for (const [key, value] of options.annotations) {
|
|
55
|
+
// attributes[key] = unknownToAttributeValue(value)
|
|
56
|
+
// }
|
|
57
|
+
// const now = options.date.getTime()
|
|
58
|
+
// for (const span of options.spans) {
|
|
59
|
+
// attributes[`logSpan.${span.label}`] = `${now - span.startTime}ms`
|
|
60
|
+
// }
|
|
64
61
|
|
|
65
62
|
const message = Arr.ensure(options.message).map(unknownToAttributeValue)
|
|
66
63
|
otelLogger.emit({
|
|
67
64
|
body: message.length === 1 ? message[0] : message,
|
|
68
|
-
severityText: options.logLevel
|
|
69
|
-
severityNumber: options.logLevel
|
|
65
|
+
severityText: options.logLevel,
|
|
66
|
+
severityNumber: LogLevel.getOrdinal(options.logLevel),
|
|
70
67
|
timestamp: options.date,
|
|
71
|
-
observedTimestamp: clock.
|
|
68
|
+
observedTimestamp: clock.currentTimeMillisUnsafe(),
|
|
72
69
|
attributes
|
|
73
70
|
})
|
|
74
71
|
})
|
|
@@ -76,27 +73,27 @@ export const make: Effect.Effect<
|
|
|
76
73
|
|
|
77
74
|
/**
|
|
78
75
|
* @since 1.0.0
|
|
79
|
-
* @category
|
|
76
|
+
* @category Layers
|
|
80
77
|
*/
|
|
81
|
-
export const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
78
|
+
export const layer = (options: {
|
|
79
|
+
/**
|
|
80
|
+
* If set to `true`, the OpenTelemetry logger will be merged with existing
|
|
81
|
+
* loggers in the application.
|
|
82
|
+
*
|
|
83
|
+
* If set to `false`, the OpenTelemetry logger will replace all existing
|
|
84
|
+
* loggers in the application.
|
|
85
|
+
*
|
|
86
|
+
* Defaults to `true`.
|
|
87
|
+
*/
|
|
88
|
+
readonly mergeWithExisting?: boolean | undefined
|
|
89
|
+
}): Layer.Layer<never, never, OtelLoggerProvider> =>
|
|
90
|
+
Logger.layer([make], {
|
|
91
|
+
mergeWithExisting: options.mergeWithExisting ?? true
|
|
92
|
+
})
|
|
96
93
|
|
|
97
94
|
/**
|
|
98
95
|
* @since 1.0.0
|
|
99
|
-
* @category
|
|
96
|
+
* @category Layers
|
|
100
97
|
*/
|
|
101
98
|
export const layerLoggerProvider = (
|
|
102
99
|
processor: Otel.LogRecordProcessor | NonEmptyReadonlyArray<Otel.LogRecordProcessor>,
|
|
@@ -104,10 +101,11 @@ export const layerLoggerProvider = (
|
|
|
104
101
|
readonly shutdownTimeout?: DurationInput | undefined
|
|
105
102
|
}
|
|
106
103
|
): Layer.Layer<OtelLoggerProvider, never, Resource> =>
|
|
107
|
-
Layer.
|
|
104
|
+
Layer.effect(
|
|
108
105
|
OtelLoggerProvider,
|
|
109
|
-
Effect.
|
|
110
|
-
|
|
106
|
+
Effect.gen(function*() {
|
|
107
|
+
const resource = yield* Resource
|
|
108
|
+
return yield* Effect.acquireRelease(
|
|
111
109
|
Effect.sync(() =>
|
|
112
110
|
new Otel.LoggerProvider({
|
|
113
111
|
...(config ?? undefined),
|
|
@@ -116,12 +114,11 @@ export const layerLoggerProvider = (
|
|
|
116
114
|
})
|
|
117
115
|
),
|
|
118
116
|
(provider) =>
|
|
119
|
-
Effect.promise(
|
|
120
|
-
|
|
121
|
-
).pipe(
|
|
122
|
-
Effect.ignoreLogged,
|
|
117
|
+
Effect.promise(() => provider.forceFlush().then(() => provider.shutdown())).pipe(
|
|
118
|
+
Effect.ignore,
|
|
123
119
|
Effect.interruptible,
|
|
124
120
|
Effect.timeoutOption(config?.shutdownTimeout ?? 3000)
|
|
125
121
|
)
|
|
126
|
-
)
|
|
122
|
+
)
|
|
123
|
+
})
|
|
127
124
|
)
|
package/src/Metrics.ts
CHANGED
|
@@ -2,39 +2,113 @@
|
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
4
|
import type { MetricProducer, MetricReader } from "@opentelemetry/sdk-metrics"
|
|
5
|
-
import type
|
|
5
|
+
import type * as Arr from "effect/Array"
|
|
6
6
|
import type { DurationInput } from "effect/Duration"
|
|
7
|
-
import
|
|
7
|
+
import * as Effect from "effect/Effect"
|
|
8
8
|
import type { LazyArg } from "effect/Function"
|
|
9
|
-
import
|
|
9
|
+
import * as Layer from "effect/Layer"
|
|
10
10
|
import type * as Scope from "effect/Scope"
|
|
11
|
-
import
|
|
12
|
-
import
|
|
11
|
+
import { MetricProducerImpl } from "./internal/metrics.ts"
|
|
12
|
+
import { Resource } from "./Resource.ts"
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
+
* Determines how metric values relate to the time interval over which they
|
|
16
|
+
* are aggregated.
|
|
17
|
+
*
|
|
18
|
+
* - `cumulative`: Reports total since a fixed start time. Each data point
|
|
19
|
+
* depends on all previous measurements. This is the default behavior.
|
|
20
|
+
*
|
|
21
|
+
* - `delta`: Reports changes since the last export. Each interval is
|
|
22
|
+
* independent with no dependency on previous measurements.
|
|
23
|
+
*
|
|
15
24
|
* @since 1.0.0
|
|
16
|
-
* @category
|
|
25
|
+
* @category Models
|
|
17
26
|
*/
|
|
18
|
-
export
|
|
27
|
+
export type TemporalityPreference = "cumulative" | "delta"
|
|
19
28
|
|
|
20
29
|
/**
|
|
30
|
+
* Creates an OpenTelemetry metric producer from Effect metrics.
|
|
31
|
+
*
|
|
21
32
|
* @since 1.0.0
|
|
22
|
-
* @category
|
|
33
|
+
* @category Constructors
|
|
23
34
|
*/
|
|
24
|
-
export const
|
|
35
|
+
export const makeProducer = (temporality?: TemporalityPreference): Effect.Effect<MetricProducer, never, Resource> =>
|
|
36
|
+
Effect.gen(function*() {
|
|
37
|
+
const resource = yield* Resource
|
|
38
|
+
const services = yield* Effect.services<never>()
|
|
39
|
+
return new MetricProducerImpl(resource, services, temporality)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Registers a metric producer with one or more metric readers.
|
|
44
|
+
*
|
|
45
|
+
* @since 1.0.0
|
|
46
|
+
* @category Constructors
|
|
47
|
+
*/
|
|
48
|
+
export const registerProducer = (
|
|
25
49
|
self: MetricProducer,
|
|
26
|
-
metricReader: LazyArg<MetricReader | NonEmptyReadonlyArray<MetricReader
|
|
27
|
-
|
|
50
|
+
metricReader: LazyArg<MetricReader | Arr.NonEmptyReadonlyArray<MetricReader>>,
|
|
51
|
+
options?: {
|
|
52
|
+
readonly shutdownTimeout?: DurationInput | undefined
|
|
53
|
+
}
|
|
54
|
+
): Effect.Effect<Array<any>, never, Scope.Scope> =>
|
|
55
|
+
Effect.acquireRelease(
|
|
56
|
+
Effect.sync(() => {
|
|
57
|
+
const reader = metricReader()
|
|
58
|
+
const readers: Array<MetricReader> = Array.isArray(reader) ? reader : [reader] as any
|
|
59
|
+
readers.forEach((reader) => reader.setMetricProducer(self))
|
|
60
|
+
return readers
|
|
61
|
+
}),
|
|
62
|
+
(readers) =>
|
|
63
|
+
Effect.promise(() =>
|
|
64
|
+
Promise.all(
|
|
65
|
+
readers.map((reader) => reader.shutdown())
|
|
66
|
+
)
|
|
67
|
+
).pipe(
|
|
68
|
+
Effect.ignore,
|
|
69
|
+
Effect.interruptible,
|
|
70
|
+
Effect.timeoutOption(options?.shutdownTimeout ?? 3000)
|
|
71
|
+
)
|
|
72
|
+
)
|
|
28
73
|
|
|
29
74
|
/**
|
|
75
|
+
* Creates a Layer that registers a metric producer with metric readers.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* import { Metrics } from "@effect/opentelemetry"
|
|
80
|
+
* import { PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics"
|
|
81
|
+
* import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http"
|
|
82
|
+
*
|
|
83
|
+
* const metricExporter = new OTLPMetricExporter({ url: "<your-otel-url>" })
|
|
84
|
+
*
|
|
85
|
+
* // Use delta temporality for backends like Datadog or Dynatrace
|
|
86
|
+
* const metricsLayer = Metrics.layer(
|
|
87
|
+
* () => new PeriodicExportingMetricReader({
|
|
88
|
+
* exporter: metricExporter,
|
|
89
|
+
* exportIntervalMillis: 10000
|
|
90
|
+
* }),
|
|
91
|
+
* { temporality: "delta" }
|
|
92
|
+
* )
|
|
93
|
+
*
|
|
94
|
+
* // Use cumulative temporality for backends like Prometheus (default)
|
|
95
|
+
* const cumulativeLayer = Metrics.layer(
|
|
96
|
+
* () => new PeriodicExportingMetricReader({ exporter: metricExporter }),
|
|
97
|
+
* { temporality: "cumulative" }
|
|
98
|
+
* )
|
|
99
|
+
* ```
|
|
100
|
+
*
|
|
30
101
|
* @since 1.0.0
|
|
31
|
-
* @category
|
|
102
|
+
* @category Layers
|
|
32
103
|
*/
|
|
33
|
-
export const layer
|
|
34
|
-
evaluate: LazyArg<MetricReader | NonEmptyReadonlyArray<MetricReader>>,
|
|
104
|
+
export const layer = (
|
|
105
|
+
evaluate: LazyArg<MetricReader | Arr.NonEmptyReadonlyArray<MetricReader>>,
|
|
35
106
|
options?: {
|
|
36
|
-
readonly shutdownTimeout?:
|
|
37
|
-
|
|
38
|
-
| undefined
|
|
107
|
+
readonly shutdownTimeout?: DurationInput | undefined
|
|
108
|
+
readonly temporality?: TemporalityPreference | undefined
|
|
39
109
|
}
|
|
40
|
-
)
|
|
110
|
+
): Layer.Layer<never, never, Resource> =>
|
|
111
|
+
Layer.effectDiscard(Effect.flatMap(
|
|
112
|
+
makeProducer(options?.temporality),
|
|
113
|
+
(producer) => registerProducer(producer, evaluate, options)
|
|
114
|
+
))
|