@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 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-u18a.0](https://github.com/Agoric/agoric-sdk/compare/@agoric/telemetry@0.6.3-u18.4...@agoric/telemetry@0.6.3-u18a.0) (2025-02-07)
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
- * **telemetry:** timer-poll run.id ([#10672](https://github.com/Agoric/agoric-sdk/issues/10672)) ([4185e77](https://github.com/Agoric/agoric-sdk/commit/4185e77aec0babcb00057ff35ea7d8ec3f631976)), closes [#10357](https://github.com/Agoric/agoric-sdk/issues/10357) [#10357](https://github.com/Agoric/agoric-sdk/issues/10357)
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-u18.2](https://github.com/Agoric/agoric-sdk/compare/@agoric/telemetry@0.6.3-u18.1...@agoric/telemetry@0.6.3-u18.2) (2024-12-09)
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-18a-dev-4ee0508.0+4ee0508",
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-18a-dev-4ee0508.0+4ee0508",
26
- "@agoric/store": "0.9.3-upgrade-18a-dev-4ee0508.0+4ee0508",
27
- "@endo/errors": "^1.2.8",
28
- "@endo/init": "^1.1.7",
29
- "@endo/marshal": "^1.6.2",
30
- "@endo/stream": "^1.2.8",
31
- "@opentelemetry/api": "~1.3.0",
32
- "@opentelemetry/api-logs": "0.53.0",
33
- "@opentelemetry/exporter-logs-otlp-http": "0.53.0",
34
- "@opentelemetry/exporter-prometheus": "~0.35.0",
35
- "@opentelemetry/exporter-trace-otlp-http": "~0.35.0",
36
- "@opentelemetry/resources": "~1.9.0",
37
- "@opentelemetry/sdk-logs": "0.53.0",
38
- "@opentelemetry/sdk-metrics": "~1.9.0",
39
- "@opentelemetry/sdk-trace-base": "~1.9.0",
40
- "@opentelemetry/semantic-conventions": "~1.27.0",
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.13",
47
- "@endo/ses-ava": "^1.2.8",
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": "4ee05088e5ada989a866a11ff65838d395505ce6"
71
+ "gitHead": "aa5fa276b7fb72283263b4ab05d7dec3807fa50c"
72
72
  }
@@ -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 {Awaited<ReturnType<typeof makeSimpleCircularBuffer>>} CircularBuffer */
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 finishCircularBuffer(arenaSize, header, readRecord, writeRecord) {
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 finishCircularBuffer(arenaSize, header, readRecord, writeRecord);
272
+ return {
273
+ fileHandle: file,
274
+ ...makeCircBufMethods(arenaSize, header, readRecord, writeRecord),
275
+ };
269
276
  };
270
277
 
271
278
  /**
272
279
  *
273
- * @param {Pick<Awaited<ReturnType<typeof makeSimpleCircularBuffer>>, 'writeCircBuf'>} circBuf
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 Promise.resolve(slogSender?.forceFlush?.()).catch(err => {
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(
@@ -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
- ]).then(() => {}),
166
- shutdown: async () =>
167
- PromiseAllOrErrors(senders.map(sender => sender.shutdown?.())).then(
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('Enabling OTLP Traces Exporter to', exporter.getDefaultUrl({}));
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 { name: tmpFile, removeCallback } = tmp.fileSync();
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