@flowrensic/node 0.2.0 → 0.4.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.
Files changed (45) hide show
  1. package/dist/gen/flowrensic/v1/activity_metrics_pb.d.ts +82 -3
  2. package/dist/gen/flowrensic/v1/activity_metrics_pb.d.ts.map +1 -1
  3. package/dist/gen/flowrensic/v1/activity_metrics_pb.js +1 -1
  4. package/dist/gen/flowrensic/v1/activity_metrics_pb.js.map +1 -1
  5. package/dist/gen/flowrensic/v1/cost_pb.d.ts +217 -0
  6. package/dist/gen/flowrensic/v1/cost_pb.d.ts.map +1 -0
  7. package/dist/gen/flowrensic/v1/cost_pb.js +50 -0
  8. package/dist/gen/flowrensic/v1/cost_pb.js.map +1 -0
  9. package/dist/gen/flowrensic/v1/deploy_pb.d.ts +226 -0
  10. package/dist/gen/flowrensic/v1/deploy_pb.d.ts.map +1 -0
  11. package/dist/gen/flowrensic/v1/deploy_pb.js +50 -0
  12. package/dist/gen/flowrensic/v1/deploy_pb.js.map +1 -0
  13. package/dist/gen/flowrensic/v1/env_instance_pb.d.ts +332 -0
  14. package/dist/gen/flowrensic/v1/env_instance_pb.d.ts.map +1 -0
  15. package/dist/gen/flowrensic/v1/env_instance_pb.js +80 -0
  16. package/dist/gen/flowrensic/v1/env_instance_pb.js.map +1 -0
  17. package/dist/gen/flowrensic/v1/finding_pb.d.ts +73 -1
  18. package/dist/gen/flowrensic/v1/finding_pb.d.ts.map +1 -1
  19. package/dist/gen/flowrensic/v1/finding_pb.js +21 -1
  20. package/dist/gen/flowrensic/v1/finding_pb.js.map +1 -1
  21. package/dist/gen/flowrensic/v1/replay_pb.d.ts +13 -5
  22. package/dist/gen/flowrensic/v1/replay_pb.d.ts.map +1 -1
  23. package/dist/gen/flowrensic/v1/replay_pb.js +1 -1
  24. package/dist/gen/flowrensic/v1/replay_pb.js.map +1 -1
  25. package/dist/gen/flowrensic/v1/services_pb.d.ts +98 -0
  26. package/dist/gen/flowrensic/v1/services_pb.d.ts.map +1 -1
  27. package/dist/gen/flowrensic/v1/services_pb.js +4 -1
  28. package/dist/gen/flowrensic/v1/services_pb.js.map +1 -1
  29. package/dist/index.d.ts +5 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +3 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/interceptor.d.ts +17 -5
  34. package/dist/interceptor.d.ts.map +1 -1
  35. package/dist/interceptor.js +16 -6
  36. package/dist/interceptor.js.map +1 -1
  37. package/dist/replay.d.ts +10 -6
  38. package/dist/replay.d.ts.map +1 -1
  39. package/dist/replay.js +8 -5
  40. package/dist/replay.js.map +1 -1
  41. package/dist/telemetry.d.ts +40 -0
  42. package/dist/telemetry.d.ts.map +1 -0
  43. package/dist/telemetry.js +119 -0
  44. package/dist/telemetry.js.map +1 -0
  45. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  import { timestampFromDate } from '@bufbuild/protobuf/wkt';
2
2
  import { ApplicationFailure, CancelledFailure } from '@temporalio/common';
3
3
  import { Outcome } from './gen/flowrensic/v1/activity_metrics_pb.js';
4
+ const noEnv = { env: '', envInstanceId: '' };
4
5
  function classify(err) {
5
6
  if (err instanceof CancelledFailure) {
6
7
  return { outcome: Outcome.CANCELED, errorType: 'CancelledFailure' };
@@ -16,7 +17,8 @@ function classify(err) {
16
17
  /**
17
18
  * Records one event per activity attempt, which is everything Temporal's own
18
19
  * OpenTelemetry spans throw away: the attempt number, the workflow type, the
19
- * task queue and the failure classification.
20
+ * task queue, the failure classification, and the start to close timeout and
21
+ * maximum attempts the activity context was handed for this attempt.
20
22
  *
21
23
  * Activity inbound, never workflow inbound. This runs in the activity worker
22
24
  * where I/O is ordinary. Emitting from a workflow interceptor would be
@@ -26,10 +28,12 @@ export class FlowrensicActivityInterceptor {
26
28
  ctx;
27
29
  sink;
28
30
  namespaceId;
29
- constructor(ctx, sink, namespaceId) {
31
+ env;
32
+ constructor(ctx, sink, namespaceId, env = noEnv) {
30
33
  this.ctx = ctx;
31
34
  this.sink = sink;
32
35
  this.namespaceId = namespaceId;
36
+ this.env = env;
33
37
  }
34
38
  async execute(input, next) {
35
39
  const info = this.ctx.info;
@@ -39,6 +43,9 @@ export class FlowrensicActivityInterceptor {
39
43
  this.sink.record({
40
44
  $typeName: 'flowrensic.v1.ActivityAttempt',
41
45
  namespaceId: this.namespaceId,
46
+ env: this.env.env,
47
+ envInstanceId: this.env.envInstanceId,
48
+ version: this.env.version ?? '',
42
49
  workflowType: info.workflowType ?? '',
43
50
  workflowExecutionId: info.workflowExecution?.workflowId ?? '',
44
51
  runKey: info.workflowExecution?.runId ?? '',
@@ -51,6 +58,8 @@ export class FlowrensicActivityInterceptor {
51
58
  startedAt: timestampFromDate(startedAt),
52
59
  endedAt: timestampFromDate(endedAt),
53
60
  durationMs: BigInt(endedAt.getTime() - startedAt.getTime()),
61
+ startToCloseTimeoutMs: BigInt(Math.round(info.startToCloseTimeoutMs)),
62
+ maximumAttempts: info.retryPolicy?.maximumAttempts ?? 0,
54
63
  });
55
64
  };
56
65
  try {
@@ -66,12 +75,13 @@ export class FlowrensicActivityInterceptor {
66
75
  }
67
76
  }
68
77
  /**
69
- * Pass to `Worker.create({ interceptors: { activity: [flowrensicInterceptor(sink, namespaceId)] } })`.
70
- * `namespaceId` identifies the namespace this worker is pointed at.
78
+ * Pass to `Worker.create({ interceptors: { activity: [flowrensicInterceptor(sink, namespaceId, env)] } })`.
79
+ * `namespaceId` identifies the namespace this worker is pointed at, and `env`
80
+ * the environment it runs in. A worker that passes no env reports none.
71
81
  */
72
- export function flowrensicInterceptor(sink, namespaceId) {
82
+ export function flowrensicInterceptor(sink, namespaceId, env = noEnv) {
73
83
  return (ctx) => ({
74
- inbound: new FlowrensicActivityInterceptor(ctx, sink, namespaceId),
84
+ inbound: new FlowrensicActivityInterceptor(ctx, sink, namespaceId, env),
75
85
  });
76
86
  }
77
87
  //# sourceMappingURL=interceptor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"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"}
package/dist/replay.d.ts CHANGED
@@ -6,13 +6,16 @@ export interface ReplaySetEntry {
6
6
  readonly file: string;
7
7
  readonly status: string;
8
8
  readonly deploy_env?: string;
9
+ /** The build ids the history carries, unknown when it carries none. */
10
+ readonly code_versions: readonly string[];
9
11
  readonly events: number;
10
12
  readonly started_at: string;
11
13
  readonly closed_at?: string;
12
14
  }
13
15
  export interface ReplaySet {
14
16
  readonly workflow_type: string;
15
- readonly deploy_env?: string;
17
+ readonly deploy_env: string;
18
+ readonly code_version?: string;
16
19
  readonly fetched_at: string;
17
20
  readonly server: string;
18
21
  readonly histories: readonly ReplaySetEntry[];
@@ -24,10 +27,10 @@ export interface FetchOptions {
24
27
  workflowType: string;
25
28
  /** Directory to write the histories and the manifest into. */
26
29
  dir: string;
27
- /** Left out, the set spans every environment. */
28
- deployEnv?: string;
29
- /** Left out, the server picks how many. */
30
- limit?: number;
30
+ /** A set holds one environment, and one that is not registered is an error. */
31
+ deployEnv: string;
32
+ /** Named, only the histories tagged with it come back. */
33
+ codeVersion?: string;
31
34
  }
32
35
  /** What one history did when replayed against the checkout under test. */
33
36
  export interface ReplayVerdict {
@@ -47,7 +50,8 @@ export interface PublishOptions {
47
50
  verdicts: readonly ReplayVerdict[];
48
51
  }
49
52
  /**
50
- * Fetches the set the server picks for a workflow type and writes it to disk.
53
+ * Fetches the set the server picks for a workflow type in one environment and
54
+ * writes it to disk.
51
55
  *
52
56
  * Which histories are worth replaying is the server's call, not the caller's.
53
57
  * What comes down is the engine's own history, verbatim, so a replayer reads
@@ -1 +1 @@
1
- {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAQA,0EAA0E;AAC1E,eAAO,MAAM,UAAU,oBAAoB,CAAC;AAE5C,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CACpC;AAqBD;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAmD9E;AAQD,yEAAyE;AACzE,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAOnE;AAED,gFAAgF;AAChF,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGrE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB5E"}
1
+ {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAQA,0EAA0E;AAC1E,eAAO,MAAM,UAAU,oBAAoB,CAAC;AAE5C,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,uEAAuE;IACvE,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CACpC;AAqBD;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAqD9E;AAQD,yEAAyE;AACzE,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAOnE;AAED,gFAAgF;AAChF,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGrE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB5E"}
package/dist/replay.js CHANGED
@@ -23,7 +23,8 @@ function historyUrl(baseUrl, path) {
23
23
  return new URL(path.replace(/^\//, ''), base);
24
24
  }
25
25
  /**
26
- * Fetches the set the server picks for a workflow type and writes it to disk.
26
+ * Fetches the set the server picks for a workflow type in one environment and
27
+ * writes it to disk.
27
28
  *
28
29
  * Which histories are worth replaying is the server's call, not the caller's.
29
30
  * What comes down is the engine's own history, verbatim, so a replayer reads
@@ -33,12 +34,12 @@ function historyUrl(baseUrl, path) {
33
34
  * code, through its own SDK, and `publishVerdicts` takes the outcome back.
34
35
  */
35
36
  export async function fetchReplaySet(options) {
36
- const { baseUrl, workflowType, dir, deployEnv, limit } = options;
37
+ const { baseUrl, workflowType, dir, deployEnv, codeVersion } = options;
37
38
  const client = createFlowrensicClient(baseUrl);
38
39
  const found = await client.query.listReplayHistories({
39
40
  workflowType,
40
- deployEnv: deployEnv ?? '',
41
- limit: limit ?? 0,
41
+ deployEnv,
42
+ codeVersion: codeVersion ?? '',
42
43
  });
43
44
  // An empty set is not an error: a workflow type with no runs yet is a normal
44
45
  // state on a new pipeline, and the caller decides what to do about it.
@@ -61,6 +62,7 @@ export async function fetchReplaySet(options) {
61
62
  file,
62
63
  status: STATUS_LABELS[history.status],
63
64
  ...(history.deployEnv === '' ? {} : { deploy_env: history.deployEnv }),
65
+ code_versions: history.codeVersions,
64
66
  events: history.events,
65
67
  started_at: (history.startedAt ? timestampDate(history.startedAt) : new Date(0)).toISOString(),
66
68
  ...(history.closedAt ? { closed_at: timestampDate(history.closedAt).toISOString() } : {}),
@@ -68,7 +70,8 @@ export async function fetchReplaySet(options) {
68
70
  }
69
71
  const set = {
70
72
  workflow_type: workflowType,
71
- ...(deployEnv === undefined || deployEnv === '' ? {} : { deploy_env: deployEnv }),
73
+ deploy_env: deployEnv,
74
+ ...(codeVersion === undefined ? {} : { code_version: codeVersion }),
72
75
  fetched_at: new Date().toISOString(),
73
76
  server: baseUrl,
74
77
  histories,
@@ -1 +1 @@
1
- {"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type AttemptSink } from './sink.js';
2
+ export interface EnvInstanceTelemetryOptions {
3
+ /** The Flowrensic server the handshake goes to. */
4
+ baseUrl: string;
5
+ /** The environment this worker runs in, as the Flowrensic env list names it. */
6
+ deployEnv: string;
7
+ /** Which run of that env this is, from the CI env. Left out, it has none. */
8
+ envInstanceId?: string;
9
+ /**
10
+ * The engine's Prometheus endpoint, as host:port, when the worker's own
11
+ * config carries one. Left out, this worker knows of none.
12
+ */
13
+ metricsAddress?: string;
14
+ /** The gRPC address, which a worker always knows. */
15
+ temporalAddress: string;
16
+ namespace: string;
17
+ }
18
+ export interface EnvInstanceTelemetry {
19
+ /** Whether the handshake told this worker to collect the engine's metrics. */
20
+ readonly forwarding: boolean;
21
+ /** The interval the answer carried, in seconds. */
22
+ readonly intervalSeconds: number;
23
+ /** The sink the activity interceptor reports to. */
24
+ readonly sink: AttemptSink;
25
+ /**
26
+ * The last scrape, the histories of the runs this worker saw, and the
27
+ * handover. It returns once all three have landed.
28
+ */
29
+ shutdown(): Promise<void>;
30
+ }
31
+ /**
32
+ * Makes one handshake with the env name and the env-instance-id, and throws
33
+ * when it goes unanswered. The answer says whether this worker scrapes the
34
+ * engine and how often.
35
+ *
36
+ * On that interval it forwards the raw exposition when it was told to, and the
37
+ * history of every run the interceptor reported, read over gRPC.
38
+ */
39
+ export declare function startEnvInstanceTelemetry(options: EnvInstanceTelemetryOptions): Promise<EnvInstanceTelemetry>;
40
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAEhE,MAAM,WAAW,2BAA2B;IAC1C,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAcD;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,oBAAoB,CAAC,CAyG/B"}
@@ -0,0 +1,119 @@
1
+ import { historyToJSON } from '@temporalio/common/lib/proto-utils.js';
2
+ import { NativeConnection } from '@temporalio/worker';
3
+ import { createFlowrensicClient } from './client.js';
4
+ import { createAttemptSink } from './sink.js';
5
+ /** Runs the job and swallows what it throws. */
6
+ async function ignoringFailure(job) {
7
+ try {
8
+ await job();
9
+ }
10
+ catch {
11
+ return;
12
+ }
13
+ }
14
+ /**
15
+ * Makes one handshake with the env name and the env-instance-id, and throws
16
+ * when it goes unanswered. The answer says whether this worker scrapes the
17
+ * engine and how often.
18
+ *
19
+ * On that interval it forwards the raw exposition when it was told to, and the
20
+ * history of every run the interceptor reported, read over gRPC.
21
+ */
22
+ export async function startEnvInstanceTelemetry(options) {
23
+ const { baseUrl, deployEnv, temporalAddress, namespace } = options;
24
+ const envInstanceId = options.envInstanceId ?? '';
25
+ const metricsAddress = options.metricsAddress ?? '';
26
+ const client = createFlowrensicClient(baseUrl);
27
+ const answer = await client.ingest.envInstanceHandshake({
28
+ deployEnv,
29
+ envInstanceId,
30
+ metricsAddress,
31
+ });
32
+ const forwarding = answer.forward;
33
+ const intervalSeconds = answer.intervalSeconds;
34
+ const connection = await NativeConnection.connect({ address: temporalAddress });
35
+ // The runs the interceptor saw, as run id to workflow id.
36
+ const seen = new Map();
37
+ const inner = createAttemptSink({ baseUrl });
38
+ const sink = {
39
+ record(attempt) {
40
+ if (attempt.runKey !== '' && attempt.workflowExecutionId !== '') {
41
+ seen.set(attempt.runKey, attempt.workflowExecutionId);
42
+ }
43
+ inner.record(attempt);
44
+ },
45
+ async flush() {
46
+ await inner.flush();
47
+ },
48
+ async close() {
49
+ await inner.close();
50
+ },
51
+ };
52
+ const scrape = async () => {
53
+ const res = await fetch(`http://${metricsAddress}/metrics`);
54
+ if (!res.ok)
55
+ throw new Error(`metrics endpoint returned ${res.status}`);
56
+ const exposition = await res.text();
57
+ await client.ingest.ingestEnvInstanceMetrics({ deployEnv, envInstanceId, exposition });
58
+ };
59
+ const forwardHistory = async (runId, workflowId) => {
60
+ const events = [];
61
+ let nextPageToken;
62
+ for (;;) {
63
+ const page = await connection.workflowService.getWorkflowExecutionHistory({
64
+ namespace,
65
+ execution: { workflowId, runId },
66
+ ...(nextPageToken === undefined ? {} : { nextPageToken }),
67
+ });
68
+ const got = page.history?.events;
69
+ if (got !== undefined && got !== null)
70
+ events.push(...got);
71
+ if (page.nextPageToken.length === 0)
72
+ break;
73
+ nextPageToken = page.nextPageToken;
74
+ }
75
+ await client.ingest.ingestEngineHistory({
76
+ deployEnv,
77
+ envInstanceId,
78
+ runId,
79
+ raw: new TextEncoder().encode(historyToJSON({ events })),
80
+ });
81
+ };
82
+ const collect = async () => {
83
+ if (forwarding)
84
+ await ignoringFailure(scrape);
85
+ for (const [runId, workflowId] of [...seen]) {
86
+ await ignoringFailure(async () => {
87
+ await forwardHistory(runId, workflowId);
88
+ });
89
+ }
90
+ };
91
+ // One tick at a time: a tick waits for the one before it to finish.
92
+ let working = Promise.resolve();
93
+ const queue = async (job) => {
94
+ working = working.then(job);
95
+ await working;
96
+ };
97
+ const timer = intervalSeconds > 0
98
+ ? setInterval(() => {
99
+ void queue(collect);
100
+ }, intervalSeconds * 1000)
101
+ : undefined;
102
+ timer?.unref();
103
+ return {
104
+ forwarding,
105
+ intervalSeconds,
106
+ sink,
107
+ async shutdown() {
108
+ if (timer !== undefined)
109
+ clearInterval(timer);
110
+ await queue(collect);
111
+ await sink.close();
112
+ await ignoringFailure(async () => {
113
+ await client.ingest.envInstanceHandover({ deployEnv, envInstanceId });
114
+ });
115
+ await connection.close();
116
+ },
117
+ };
118
+ }
119
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowrensic/node",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Replay history fetch and activity interceptor for Temporal workers, for use with Flowrensic.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",