@agoric/telemetry 0.6.3-upgrade-18a-dev-4ee0508.0 → 0.6.3-upgrade-19-dev-aa5fa27.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/CHANGELOG.md +7 -42
- package/package.json +20 -20
- package/src/flight-recorder.js +18 -7
- package/src/index.js +6 -2
- package/src/make-slog-sender.js +7 -7
- package/src/otel-trace.js +11 -1
- package/test/flight-recorder.test.js +12 -4
package/CHANGELOG.md
CHANGED
|
@@ -3,55 +3,16 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
-
### [0.6.3-
|
|
7
|
-
|
|
8
|
-
**Note:** Version bump only for package @agoric/telemetry
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
### [0.6.3-u18.4](https://github.com/Agoric/agoric-sdk/compare/@agoric/telemetry@0.6.3-u18.3...@agoric/telemetry@0.6.3-u18.4) (2024-12-24)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
### Bug Fixes
|
|
18
|
-
|
|
19
|
-
* **telemetry:** add missing slog type ([1aec8d0](https://github.com/Agoric/agoric-sdk/commit/1aec8d05036f6b3c3e3730339d1829da6b4a9051))
|
|
20
|
-
* **telemetry:** Empty context persisted when remaining beans are negative after run finish ([#10635](https://github.com/Agoric/agoric-sdk/issues/10635)) ([ad4e83e](https://github.com/Agoric/agoric-sdk/commit/ad4e83e0b6dff9716da91fd65d367d3acad1772e))
|
|
21
|
-
* **telemetry:** event name typo ([9e19321](https://github.com/Agoric/agoric-sdk/commit/9e19321ea8fed32d445d44169b32f5d94a93d61e))
|
|
22
|
-
* **telemetry:** timer-poll run.id ([#10672](https://github.com/Agoric/agoric-sdk/issues/10672)) ([3b478fb](https://github.com/Agoric/agoric-sdk/commit/3b478fb9e3fe7ded8dec1e83bab68760571f9071)), closes [#10357](https://github.com/Agoric/agoric-sdk/issues/10357) [#10357](https://github.com/Agoric/agoric-sdk/issues/10357)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
### [0.6.3-u18.3](https://github.com/Agoric/agoric-sdk/compare/@agoric/telemetry@0.6.3-u18.2...@agoric/telemetry@0.6.3-u18.3) (2024-12-13)
|
|
6
|
+
### [0.6.3-u19.1](https://github.com/Agoric/agoric-sdk/compare/@agoric/telemetry@0.6.3-u19.0...@agoric/telemetry@0.6.3-u19.1) (2025-03-03)
|
|
27
7
|
|
|
28
8
|
|
|
29
9
|
### Bug Fixes
|
|
30
10
|
|
|
31
|
-
*
|
|
11
|
+
* Properly synchronize slog sender termination ([2fc342c](https://github.com/Agoric/agoric-sdk/commit/2fc342c180e296208d077a1d4799da139d3b7848))
|
|
32
12
|
|
|
33
13
|
|
|
34
14
|
|
|
35
|
-
### [0.6.3-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
### Bug Fixes
|
|
39
|
-
|
|
40
|
-
* **telemetry:** Empty context persisted when remaining beans are negative after run finish ([#10635](https://github.com/Agoric/agoric-sdk/issues/10635)) ([3988aa0](https://github.com/Agoric/agoric-sdk/commit/3988aa0f0708e367629aca30fe5d09f760ed3ef1))
|
|
41
|
-
* **telemetry:** event name typo ([070b154](https://github.com/Agoric/agoric-sdk/commit/070b154b273748fcc087a012009f70457b4a5d2d))
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
### [0.6.3-u18.1](https://github.com/Agoric/agoric-sdk/compare/@agoric/telemetry@0.6.3-u18.0...@agoric/telemetry@0.6.3-u18.1) (2024-11-19)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
### Bug Fixes
|
|
49
|
-
|
|
50
|
-
* **telemetry:** add missing slog type ([6c500d4](https://github.com/Agoric/agoric-sdk/commit/6c500d4c0c5a329ffbf8a35d6e3754b58578075c))
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
### [0.6.3-u18.0](https://github.com/Agoric/agoric-sdk/compare/@agoric/telemetry@0.6.2...@agoric/telemetry@0.6.3-u18.0) (2024-10-31)
|
|
15
|
+
### [0.6.3-u19.0](https://github.com/Agoric/agoric-sdk/compare/@agoric/telemetry@0.6.2...@agoric/telemetry@0.6.3-u19.0) (2025-02-24)
|
|
55
16
|
|
|
56
17
|
|
|
57
18
|
### Features
|
|
@@ -67,11 +28,15 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
|
|
|
67
28
|
### Bug Fixes
|
|
68
29
|
|
|
69
30
|
* ensure script main rejections exit with error ([abdab87](https://github.com/Agoric/agoric-sdk/commit/abdab879014a5c3124ebd0e9246995ac6b1ce6e5))
|
|
31
|
+
* **telemetry:** add missing slog type ([1aec8d0](https://github.com/Agoric/agoric-sdk/commit/1aec8d05036f6b3c3e3730339d1829da6b4a9051))
|
|
70
32
|
* **telemetry:** avoid polluting stdout in ingest-slog ([d4b8dfa](https://github.com/Agoric/agoric-sdk/commit/d4b8dfa91155789f7ceda5cc3cef06019b9527e7))
|
|
33
|
+
* **telemetry:** Empty context persisted when remaining beans are negative after run finish ([#10635](https://github.com/Agoric/agoric-sdk/issues/10635)) ([ad4e83e](https://github.com/Agoric/agoric-sdk/commit/ad4e83e0b6dff9716da91fd65d367d3acad1772e))
|
|
34
|
+
* **telemetry:** event name typo ([9e19321](https://github.com/Agoric/agoric-sdk/commit/9e19321ea8fed32d445d44169b32f5d94a93d61e))
|
|
71
35
|
* **telemetry:** handle new trigger slog events ([d32cb7e](https://github.com/Agoric/agoric-sdk/commit/d32cb7e9f406c25399321dc32e827b5018c38b69))
|
|
72
36
|
* **telemetry:** ingest-slog avoid writing progress file for stdin ([62589ca](https://github.com/Agoric/agoric-sdk/commit/62589ca7b6d4aaa9eb7042f95ec7aec633db27f9))
|
|
73
37
|
* **telemetry:** otel correctly pop upgrade span ([0ffdf00](https://github.com/Agoric/agoric-sdk/commit/0ffdf001bc8cbdc94081fedfeb4d2376902f4ffc)), closes [#8272](https://github.com/Agoric/agoric-sdk/issues/8272) [#9569](https://github.com/Agoric/agoric-sdk/issues/9569)
|
|
74
38
|
* **telemetry:** silence slogfile write errors ([91089d7](https://github.com/Agoric/agoric-sdk/commit/91089d7273ef3d41555b34d84471120d45602497))
|
|
39
|
+
* **telemetry:** timer-poll run.id ([#10672](https://github.com/Agoric/agoric-sdk/issues/10672)) ([3b478fb](https://github.com/Agoric/agoric-sdk/commit/3b478fb9e3fe7ded8dec1e83bab68760571f9071)), closes [#10357](https://github.com/Agoric/agoric-sdk/issues/10357) [#10357](https://github.com/Agoric/agoric-sdk/issues/10357)
|
|
75
40
|
|
|
76
41
|
|
|
77
42
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agoric/telemetry",
|
|
3
|
-
"version": "0.6.3-upgrade-
|
|
3
|
+
"version": "0.6.3-upgrade-19-dev-aa5fa27.0+aa5fa27",
|
|
4
4
|
"description": "Agoric's telemetry implementation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": "https://github.com/Agoric/agoric-sdk",
|
|
@@ -22,29 +22,29 @@
|
|
|
22
22
|
"author": "Agoric",
|
|
23
23
|
"license": "Apache-2.0",
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@agoric/internal": "0.4.0-upgrade-
|
|
26
|
-
"@agoric/store": "0.9.3-upgrade-
|
|
27
|
-
"@endo/errors": "^1.2.
|
|
28
|
-
"@endo/init": "^1.1.
|
|
29
|
-
"@endo/marshal": "^1.6.
|
|
30
|
-
"@endo/stream": "^1.2.
|
|
31
|
-
"@opentelemetry/api": "~1.
|
|
32
|
-
"@opentelemetry/api-logs": "0.
|
|
33
|
-
"@opentelemetry/exporter-logs-otlp-http": "0.
|
|
34
|
-
"@opentelemetry/exporter-prometheus": "~0.
|
|
35
|
-
"@opentelemetry/exporter-trace-otlp-http": "
|
|
36
|
-
"@opentelemetry/resources": "~1.
|
|
37
|
-
"@opentelemetry/sdk-logs": "0.
|
|
38
|
-
"@opentelemetry/sdk-metrics": "~1.
|
|
39
|
-
"@opentelemetry/sdk-trace-base": "~1.
|
|
40
|
-
"@opentelemetry/semantic-conventions": "~1.
|
|
25
|
+
"@agoric/internal": "0.4.0-upgrade-19-dev-aa5fa27.0+aa5fa27",
|
|
26
|
+
"@agoric/store": "0.9.3-upgrade-19-dev-aa5fa27.0+aa5fa27",
|
|
27
|
+
"@endo/errors": "^1.2.9",
|
|
28
|
+
"@endo/init": "^1.1.8",
|
|
29
|
+
"@endo/marshal": "^1.6.3",
|
|
30
|
+
"@endo/stream": "^1.2.9",
|
|
31
|
+
"@opentelemetry/api": "~1.9.0",
|
|
32
|
+
"@opentelemetry/api-logs": "0.57.1",
|
|
33
|
+
"@opentelemetry/exporter-logs-otlp-http": "0.57.1",
|
|
34
|
+
"@opentelemetry/exporter-prometheus": "~0.57.1",
|
|
35
|
+
"@opentelemetry/exporter-trace-otlp-http": "0.57.1",
|
|
36
|
+
"@opentelemetry/resources": "~1.30.1",
|
|
37
|
+
"@opentelemetry/sdk-logs": "0.57.1",
|
|
38
|
+
"@opentelemetry/sdk-metrics": "~1.30.1",
|
|
39
|
+
"@opentelemetry/sdk-trace-base": "~1.30.1",
|
|
40
|
+
"@opentelemetry/semantic-conventions": "~1.28.0",
|
|
41
41
|
"anylogger": "^0.21.0",
|
|
42
42
|
"better-sqlite3": "^9.1.1",
|
|
43
43
|
"tmp": "^0.2.1"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@endo/lockdown": "^1.0.
|
|
47
|
-
"@endo/ses-ava": "^1.2.
|
|
46
|
+
"@endo/lockdown": "^1.0.14",
|
|
47
|
+
"@endo/ses-ava": "^1.2.9",
|
|
48
48
|
"ava": "^5.3.0",
|
|
49
49
|
"c8": "^10.1.2",
|
|
50
50
|
"tmp": "^0.2.1"
|
|
@@ -68,5 +68,5 @@
|
|
|
68
68
|
"typeCoverage": {
|
|
69
69
|
"atLeast": 88.88
|
|
70
70
|
},
|
|
71
|
-
"gitHead": "
|
|
71
|
+
"gitHead": "aa5fa276b7fb72283263b4ab05d7dec3807fa50c"
|
|
72
72
|
}
|
package/src/flight-recorder.js
CHANGED
|
@@ -8,6 +8,10 @@ import path from 'node:path';
|
|
|
8
8
|
import { Fail } from '@endo/errors';
|
|
9
9
|
import { serializeSlogObj } from './serialize-slog-obj.js';
|
|
10
10
|
|
|
11
|
+
/**
|
|
12
|
+
* @import {EReturn} from '@endo/far';
|
|
13
|
+
*/
|
|
14
|
+
|
|
11
15
|
export const DEFAULT_CBUF_SIZE = 100 * 1024 * 1024;
|
|
12
16
|
export const DEFAULT_CBUF_FILE = 'flight-recorder.bin';
|
|
13
17
|
export const SLOG_MAGIC = 0x41472d534c4f4721n; // 'AG-SLOG!'
|
|
@@ -63,7 +67,7 @@ const initializeCircularBuffer = async (bufferFile, circularBufferSize) => {
|
|
|
63
67
|
return arenaSize;
|
|
64
68
|
};
|
|
65
69
|
|
|
66
|
-
/** @typedef {
|
|
70
|
+
/** @typedef {EReturn<typeof makeSimpleCircularBuffer>} CircularBuffer */
|
|
67
71
|
|
|
68
72
|
/**
|
|
69
73
|
*
|
|
@@ -72,7 +76,7 @@ const initializeCircularBuffer = async (bufferFile, circularBufferSize) => {
|
|
|
72
76
|
* @param {(outbuf: Uint8Array, readStart: number, firstReadLength: number) => void} readRecord
|
|
73
77
|
* @param {(record: Uint8Array, firstWriteLength: number, circEnd: bigint) => Promise<void>} writeRecord
|
|
74
78
|
*/
|
|
75
|
-
function
|
|
79
|
+
function makeCircBufMethods(arenaSize, header, readRecord, writeRecord) {
|
|
76
80
|
const readCircBuf = (outbuf, offset = 0) => {
|
|
77
81
|
offset + outbuf.byteLength <= arenaSize ||
|
|
78
82
|
Fail`Reading past end of circular buffer`;
|
|
@@ -265,14 +269,17 @@ export const makeSimpleCircularBuffer = async ({
|
|
|
265
269
|
await file.write(headerBuffer, undefined, undefined, 0);
|
|
266
270
|
};
|
|
267
271
|
|
|
268
|
-
return
|
|
272
|
+
return {
|
|
273
|
+
fileHandle: file,
|
|
274
|
+
...makeCircBufMethods(arenaSize, header, readRecord, writeRecord),
|
|
275
|
+
};
|
|
269
276
|
};
|
|
270
277
|
|
|
271
278
|
/**
|
|
272
279
|
*
|
|
273
|
-
* @param {Pick<
|
|
280
|
+
* @param {Pick<CircularBuffer, 'fileHandle' | 'writeCircBuf'>} circBuf
|
|
274
281
|
*/
|
|
275
|
-
export const makeSlogSenderFromBuffer = ({ writeCircBuf }) => {
|
|
282
|
+
export const makeSlogSenderFromBuffer = ({ fileHandle, writeCircBuf }) => {
|
|
276
283
|
/** @type {Promise<void>} */
|
|
277
284
|
let toWrite = Promise.resolve();
|
|
278
285
|
const writeJSON = (obj, serialized = serializeSlogObj(obj)) => {
|
|
@@ -285,6 +292,10 @@ export const makeSlogSenderFromBuffer = ({ writeCircBuf }) => {
|
|
|
285
292
|
forceFlush: async () => {
|
|
286
293
|
await toWrite;
|
|
287
294
|
},
|
|
295
|
+
shutdown: async () => {
|
|
296
|
+
await toWrite;
|
|
297
|
+
await fileHandle.close();
|
|
298
|
+
},
|
|
288
299
|
usesJsonObject: true,
|
|
289
300
|
});
|
|
290
301
|
};
|
|
@@ -295,6 +306,6 @@ export const makeSlogSenderFromBuffer = ({ writeCircBuf }) => {
|
|
|
295
306
|
* @type {import('./index.js').MakeSlogSender}
|
|
296
307
|
*/
|
|
297
308
|
export const makeSlogSender = async opts => {
|
|
298
|
-
const { writeCircBuf } = await makeSimpleCircularBuffer(opts);
|
|
299
|
-
return makeSlogSenderFromBuffer({ writeCircBuf });
|
|
309
|
+
const { fileHandle, writeCircBuf } = await makeSimpleCircularBuffer(opts);
|
|
310
|
+
return makeSlogSenderFromBuffer({ fileHandle, writeCircBuf });
|
|
300
311
|
};
|
package/src/index.js
CHANGED
|
@@ -34,7 +34,10 @@ export const tryFlushSlogSender = async (
|
|
|
34
34
|
slogSender,
|
|
35
35
|
{ env = {}, log } = {},
|
|
36
36
|
) => {
|
|
37
|
-
await
|
|
37
|
+
await null;
|
|
38
|
+
try {
|
|
39
|
+
await slogSender?.forceFlush?.();
|
|
40
|
+
} catch (err) {
|
|
38
41
|
log?.('Failed to flush slog sender', err);
|
|
39
42
|
if (err.errors) {
|
|
40
43
|
for (const error of err.errors) {
|
|
@@ -44,7 +47,7 @@ export const tryFlushSlogSender = async (
|
|
|
44
47
|
if (env.SLOGSENDER_FAIL_ON_ERROR) {
|
|
45
48
|
throw err;
|
|
46
49
|
}
|
|
47
|
-
}
|
|
50
|
+
}
|
|
48
51
|
};
|
|
49
52
|
|
|
50
53
|
export const getResourceAttributes = ({
|
|
@@ -111,6 +114,7 @@ const getPrometheusMeterProvider = ({
|
|
|
111
114
|
const exporter = new PrometheusExporter(
|
|
112
115
|
{
|
|
113
116
|
port,
|
|
117
|
+
appendTimestamp: true,
|
|
114
118
|
},
|
|
115
119
|
() => {
|
|
116
120
|
console.warn(
|
package/src/make-slog-sender.js
CHANGED
|
@@ -158,15 +158,15 @@ export const makeSlogSender = async (opts = {}) => {
|
|
|
158
158
|
}
|
|
159
159
|
};
|
|
160
160
|
return Object.assign(slogSender, {
|
|
161
|
-
forceFlush: async () =>
|
|
162
|
-
PromiseAllOrErrors([
|
|
161
|
+
forceFlush: async () => {
|
|
162
|
+
await PromiseAllOrErrors([
|
|
163
163
|
...senders.map(sender => sender.forceFlush?.()),
|
|
164
164
|
...sendErrors.splice(0).map(err => Promise.reject(err)),
|
|
165
|
-
])
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
165
|
+
]);
|
|
166
|
+
},
|
|
167
|
+
shutdown: async () => {
|
|
168
|
+
await PromiseAllOrErrors(senders.map(sender => sender.shutdown?.()));
|
|
169
|
+
},
|
|
170
170
|
usesJsonObject: hasSenderUsingJsonObj,
|
|
171
171
|
});
|
|
172
172
|
}
|
package/src/otel-trace.js
CHANGED
|
@@ -22,16 +22,26 @@ export const SPAN_EXPORT_DELAY_MS = 1_000;
|
|
|
22
22
|
export const makeOtelTracingProvider = opts => {
|
|
23
23
|
const { env = process.env } = opts || {};
|
|
24
24
|
|
|
25
|
+
// https://opentelemetry.io/docs/concepts/signals/
|
|
26
|
+
// https://opentelemetry.io/docs/specs/otel/protocol/exporter/#endpoint-urls-for-otlphttp
|
|
27
|
+
// https://github.com/open-telemetry/opentelemetry-js/blob/experimental/v0.57.1/experimental/packages/exporter-trace-otlp-http/README.md#configuration-options-as-environment-variables
|
|
25
28
|
const { OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_ENDPOINT } =
|
|
26
29
|
env;
|
|
27
30
|
if (!OTEL_EXPORTER_OTLP_ENDPOINT && !OTEL_EXPORTER_OTLP_TRACES_ENDPOINT) {
|
|
31
|
+
console.debug(
|
|
32
|
+
'Not enabling OTLP Traces Exporter; enable with OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=<target URL> or OTEL_EXPORTER_OTLP_ENDPOINT=<target URL prefix>',
|
|
33
|
+
);
|
|
28
34
|
return undefined;
|
|
29
35
|
}
|
|
30
36
|
|
|
31
37
|
const resource = new Resource(getResourceAttributes(opts));
|
|
32
38
|
|
|
33
39
|
const exporter = new OTLPTraceExporter();
|
|
34
|
-
console.info(
|
|
40
|
+
console.info(
|
|
41
|
+
'Enabling OTLP Traces Exporter to',
|
|
42
|
+
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ||
|
|
43
|
+
`${OTEL_EXPORTER_OTLP_ENDPOINT}/v1/traces`,
|
|
44
|
+
);
|
|
35
45
|
|
|
36
46
|
const provider = new BasicTracerProvider({ resource });
|
|
37
47
|
provider.addSpanProcessor(
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
2
3
|
import tmp from 'tmp';
|
|
3
4
|
import { test } from './prepare-test-env-ava.js';
|
|
4
5
|
|
|
@@ -17,12 +18,21 @@ const bufferTests = test.macro(
|
|
|
17
18
|
async (t, input) => {
|
|
18
19
|
const BUFFER_SIZE = 512;
|
|
19
20
|
|
|
20
|
-
const {
|
|
21
|
+
const {
|
|
22
|
+
name: tmpFile,
|
|
23
|
+
fd,
|
|
24
|
+
removeCallback,
|
|
25
|
+
} = tmp.fileSync({ detachDescriptor: true });
|
|
26
|
+
t.teardown(removeCallback);
|
|
27
|
+
const fileHandle = /** @type {import('fs/promises').FileHandle} */ ({
|
|
28
|
+
close: promisify(fs.close.bind(fs, fd)),
|
|
29
|
+
});
|
|
21
30
|
const { readCircBuf, writeCircBuf } = await input.makeBuffer({
|
|
22
31
|
circularBufferSize: BUFFER_SIZE,
|
|
23
32
|
circularBufferFilename: tmpFile,
|
|
24
33
|
});
|
|
25
|
-
const slogSender = makeSlogSenderFromBuffer({ writeCircBuf });
|
|
34
|
+
const slogSender = makeSlogSenderFromBuffer({ fileHandle, writeCircBuf });
|
|
35
|
+
t.teardown(slogSender.shutdown);
|
|
26
36
|
slogSender({ type: 'start' });
|
|
27
37
|
await slogSender.forceFlush();
|
|
28
38
|
t.is(fs.readFileSync(tmpFile, { encoding: 'utf8' }).length, BUFFER_SIZE);
|
|
@@ -73,8 +83,6 @@ const bufferTests = test.macro(
|
|
|
73
83
|
slogSender(null, 'PRE-SERIALIZED');
|
|
74
84
|
await slogSender.forceFlush();
|
|
75
85
|
t.truthy(fs.readFileSync(tmpFile).includes('PRE-SERIALIZED'));
|
|
76
|
-
// console.log({ tmpFile });
|
|
77
|
-
removeCallback();
|
|
78
86
|
},
|
|
79
87
|
);
|
|
80
88
|
|