alasio 8.0.0 → 9.0.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/dist/cli/src/api-server.js +18 -0
- package/dist/cli/src/api-server.js.map +1 -0
- package/dist/cli/src/branches.js +61 -20
- package/dist/cli/src/branches.js.map +1 -1
- package/dist/cli/src/cluster/docker.js +25 -10
- package/dist/cli/src/cluster/docker.js.map +1 -1
- package/dist/cli/src/cluster/host.js +33 -7
- package/dist/cli/src/cluster/host.js.map +1 -1
- package/dist/cli/src/cluster/k3s.js +43 -11
- package/dist/cli/src/cluster/k3s.js.map +1 -1
- package/dist/cli/src/cluster/node.js +107 -32
- package/dist/cli/src/cluster/node.js.map +1 -1
- package/dist/cli/src/cluster/stargz.js +55 -0
- package/dist/cli/src/cluster/stargz.js.map +1 -0
- package/dist/cli/src/commands/branch.js +5 -4
- package/dist/cli/src/commands/branch.js.map +1 -1
- package/dist/cli/src/commands/common.js +9 -3
- package/dist/cli/src/commands/common.js.map +1 -1
- package/dist/cli/src/commands/folder.js +14 -0
- package/dist/cli/src/commands/folder.js.map +1 -0
- package/dist/cli/src/commands/status.js +64 -12
- package/dist/cli/src/commands/status.js.map +1 -1
- package/dist/cli/src/commands/uninstall.js +8 -9
- package/dist/cli/src/commands/uninstall.js.map +1 -1
- package/dist/cli/src/commands/up.js +11 -3
- package/dist/cli/src/commands/up.js.map +1 -1
- package/dist/cli/src/commands/upgrade.js +1 -1
- package/dist/cli/src/commands/upgrade.js.map +1 -1
- package/dist/cli/src/commands.js +2 -1
- package/dist/cli/src/commands.js.map +1 -1
- package/dist/cli/src/config.js +4 -1
- package/dist/cli/src/config.js.map +1 -1
- package/dist/cli/src/cpu-baseline.js +8 -4
- package/dist/cli/src/cpu-baseline.js.map +1 -1
- package/dist/cli/src/folders.js +67 -0
- package/dist/cli/src/folders.js.map +1 -0
- package/dist/cli/src/gateway-calls.js +58 -0
- package/dist/cli/src/gateway-calls.js.map +1 -0
- package/dist/cli/src/install.js +77 -29
- package/dist/cli/src/install.js.map +1 -1
- package/dist/cli/src/kept-releases.js +27 -20
- package/dist/cli/src/kept-releases.js.map +1 -1
- package/dist/cli/src/kube/api.js +2 -3
- package/dist/cli/src/kube/api.js.map +1 -1
- package/dist/cli/src/kube/apply.js +15 -72
- package/dist/cli/src/kube/apply.js.map +1 -1
- package/dist/cli/src/kube/rollout.js +28 -16
- package/dist/cli/src/kube/rollout.js.map +1 -1
- package/dist/cli/src/manifests/admission.js +342 -223
- package/dist/cli/src/manifests/admission.js.map +1 -1
- package/dist/cli/src/manifests/alasio.js +58 -394
- package/dist/cli/src/manifests/alasio.js.map +1 -1
- package/dist/cli/src/manifests/branch.js +10 -26
- package/dist/cli/src/manifests/branch.js.map +1 -1
- package/dist/cli/src/manifests/collector.js +60 -44
- package/dist/cli/src/manifests/collector.js.map +1 -1
- package/dist/cli/src/manifests/common.js +32 -2
- package/dist/cli/src/manifests/common.js.map +1 -1
- package/dist/cli/src/manifests/config.js +64 -81
- package/dist/cli/src/manifests/config.js.map +1 -1
- package/dist/cli/src/manifests/disruption.js +10 -0
- package/dist/cli/src/manifests/disruption.js.map +1 -1
- package/dist/cli/src/manifests/folders.js +128 -0
- package/dist/cli/src/manifests/folders.js.map +1 -0
- package/dist/cli/src/manifests/grafana.js +4 -2
- package/dist/cli/src/manifests/grafana.js.map +1 -1
- package/dist/cli/src/manifests/index.js +10 -7
- package/dist/cli/src/manifests/index.js.map +1 -1
- package/dist/cli/src/manifests/lake.js +18 -4
- package/dist/cli/src/manifests/lake.js.map +1 -1
- package/dist/cli/src/manifests/log.js +32 -14
- package/dist/cli/src/manifests/log.js.map +1 -1
- package/dist/cli/src/manifests/neon.js +3 -3
- package/dist/cli/src/manifests/neon.js.map +1 -1
- package/dist/cli/src/manifests/network-policies.js +140 -74
- package/dist/cli/src/manifests/network-policies.js.map +1 -1
- package/dist/cli/src/manifests/node-agent.js +11 -4
- package/dist/cli/src/manifests/node-agent.js.map +1 -1
- package/dist/cli/src/manifests/object-store.js +4 -2
- package/dist/cli/src/manifests/object-store.js.map +1 -1
- package/dist/cli/src/manifests/sandbox-gateway.js +663 -0
- package/dist/cli/src/manifests/sandbox-gateway.js.map +1 -0
- package/dist/cli/src/manifests/scalers.js +16 -5
- package/dist/cli/src/manifests/scalers.js.map +1 -1
- package/dist/cli/src/manifests/sizing.js +16 -8
- package/dist/cli/src/manifests/sizing.js.map +1 -1
- package/dist/cli/src/manifests/valkey.js +11 -5
- package/dist/cli/src/manifests/valkey.js.map +1 -1
- package/dist/cli/src/manifests/vpa.js +3 -1
- package/dist/cli/src/manifests/vpa.js.map +1 -1
- package/dist/cli/src/manifests/workspace-storage.js +174 -89
- package/dist/cli/src/manifests/workspace-storage.js.map +1 -1
- package/dist/cli/src/neon-storage.js +54 -14
- package/dist/cli/src/neon-storage.js.map +1 -1
- package/dist/cli/src/release.js +9 -9
- package/dist/cluster/node/pins.json +9 -4
- package/dist/neon/control/branches.js +6 -6
- package/dist/neon/control/branches.js.map +1 -1
- package/dist/neon/control/secrets.js +14 -3
- package/dist/neon/control/secrets.js.map +1 -1
- package/dist/src/binder/names.js +33 -0
- package/dist/src/binder/names.js.map +1 -0
- package/dist/src/binder/tokens.js +58 -0
- package/dist/src/binder/tokens.js.map +1 -0
- package/dist/src/branch/names.js +12 -2
- package/dist/src/branch/names.js.map +1 -1
- package/dist/src/events/names.js +7 -0
- package/dist/src/events/names.js.map +1 -0
- package/dist/src/gateway/names.js +201 -0
- package/dist/src/gateway/names.js.map +1 -0
- package/dist/src/harness/names.js +49 -0
- package/dist/src/harness/names.js.map +1 -0
- package/dist/src/kube/sandbox-shape.js +8 -68
- package/dist/src/kube/sandbox-shape.js.map +1 -1
- package/dist/src/node-agent/names.js +52 -2
- package/dist/src/node-agent/names.js.map +1 -1
- package/dist/src/sandbox/names.js +12 -20
- package/dist/src/sandbox/names.js.map +1 -1
- package/dist/src/sandbox/otlp-resource.js +173 -0
- package/dist/src/sandbox/otlp-resource.js.map +1 -0
- package/dist/src/sandbox/telemetry.js +43 -0
- package/dist/src/sandbox/telemetry.js.map +1 -0
- package/dist/src/telemetry/config.js +131 -0
- package/dist/src/telemetry/config.js.map +1 -0
- package/dist/src/telemetry/forward.js +154 -0
- package/dist/src/telemetry/forward.js.map +1 -0
- package/package.json +1 -1
- package/dist/cli/src/manifests/agent-sandbox.js +0 -92
- package/dist/cli/src/manifests/agent-sandbox.js.map +0 -1
- package/dist/cli/src/manifests/juicefs-csi.js +0 -320
- package/dist/cli/src/manifests/juicefs-csi.js.map +0 -1
- package/dist/cli/src/manifests/sandboxes.agents.x-k8s.io.json +0 -6295
- package/dist/src/kube/config.js +0 -145
- package/dist/src/kube/config.js.map +0 -1
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which of alasio's signals are exported, and where, decided from the standard
|
|
3
|
+
* OpenTelemetry environment variables alone, so any OTLP backend works and none is
|
|
4
|
+
* assumed.
|
|
5
|
+
*
|
|
6
|
+
* A signal is exported when it has an endpoint, its own
|
|
7
|
+
* (`OTEL_EXPORTER_OTLP_<SIGNAL>_ENDPOINT`) or the shared one
|
|
8
|
+
* (`OTEL_EXPORTER_OTLP_ENDPOINT`), and `OTEL_<SIGNAL>_EXPORTER` is unset or `otlp`;
|
|
9
|
+
* `OTEL_SDK_DISABLED=true` turns every signal off. With no endpoint at all alasio
|
|
10
|
+
* exports nothing and loads no SDK.
|
|
11
|
+
*/
|
|
12
|
+
export const SIGNALS = ["traces", "metrics", "logs"];
|
|
13
|
+
const DEFAULT_PROTOCOL = "http/protobuf";
|
|
14
|
+
/** Variables that configure telemetry, which alasio hands no child as it is. */
|
|
15
|
+
const TELEMETRY_VARIABLE = /^(OTEL_.*|TRACEPARENT|TRACESTATE)$/u;
|
|
16
|
+
function setting(env, name) {
|
|
17
|
+
return env[name]?.trim() || null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The OTLP endpoint a signal is sent to: its own as given, else the shared one, to
|
|
21
|
+
* which OTLP over HTTP adds the signal's path and OTLP over gRPC adds nothing.
|
|
22
|
+
*/
|
|
23
|
+
function signalEndpoint(env, signal, protocol) {
|
|
24
|
+
const own = setting(env, `OTEL_EXPORTER_OTLP_${signal.toUpperCase()}_ENDPOINT`);
|
|
25
|
+
if (own)
|
|
26
|
+
return own;
|
|
27
|
+
const shared = setting(env, "OTEL_EXPORTER_OTLP_ENDPOINT");
|
|
28
|
+
if (!shared || protocol === "grpc")
|
|
29
|
+
return shared;
|
|
30
|
+
return `${shared.replace(/\/+$/u, "")}/v1/${signal}`;
|
|
31
|
+
}
|
|
32
|
+
/** How `signal` is exported, or null when it is not. */
|
|
33
|
+
function signalExporter(env, signal, disabled) {
|
|
34
|
+
const upper = signal.toUpperCase();
|
|
35
|
+
const exporter = setting(env, `OTEL_${upper}_EXPORTER`) ?? "otlp";
|
|
36
|
+
const protocol = setting(env, `OTEL_EXPORTER_OTLP_${upper}_PROTOCOL`)
|
|
37
|
+
?? setting(env, "OTEL_EXPORTER_OTLP_PROTOCOL")
|
|
38
|
+
?? DEFAULT_PROTOCOL;
|
|
39
|
+
const endpoint = signalEndpoint(env, signal, protocol);
|
|
40
|
+
if (disabled || exporter !== "otlp" || !endpoint) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return { endpoint, protocol, headers: signalHeaders(env, signal) };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* `{ traces, metrics, logs }`, each `{ endpoint, protocol, headers }` for a signal
|
|
47
|
+
* alasio exports or null for one it does not. `headers` is the standard
|
|
48
|
+
* `key=value,key=value` list, or null.
|
|
49
|
+
*/
|
|
50
|
+
export function resolveTelemetry(env = process.env) {
|
|
51
|
+
const disabled = setting(env, "OTEL_SDK_DISABLED")?.toLowerCase() === "true";
|
|
52
|
+
return {
|
|
53
|
+
traces: signalExporter(env, "traces", disabled),
|
|
54
|
+
metrics: signalExporter(env, "metrics", disabled),
|
|
55
|
+
logs: signalExporter(env, "logs", disabled),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* A signal's OTLP exporter setting `name` (HEADERS, TIMEOUT, ...): its own
|
|
60
|
+
* (`OTEL_EXPORTER_OTLP_<SIGNAL>_<NAME>`), else the shared one, or null.
|
|
61
|
+
*/
|
|
62
|
+
export function signalSetting(env, signal, name) {
|
|
63
|
+
return setting(env, `OTEL_EXPORTER_OTLP_${signal.toUpperCase()}_${name}`) ?? setting(env, `OTEL_EXPORTER_OTLP_${name}`);
|
|
64
|
+
}
|
|
65
|
+
/** The headers a signal is sent with: its own, else the shared ones, or null. */
|
|
66
|
+
export function signalHeaders(env, signal) {
|
|
67
|
+
return signalSetting(env, signal, "HEADERS");
|
|
68
|
+
}
|
|
69
|
+
/** Whether any signal is exported. */
|
|
70
|
+
export function telemetryEnabled(telemetry) {
|
|
71
|
+
return SIGNALS.some((signal) => telemetry[signal]);
|
|
72
|
+
}
|
|
73
|
+
/** An environment without the variables that configure telemetry. */
|
|
74
|
+
export function withoutTelemetry(env) {
|
|
75
|
+
return Object.fromEntries(Object.entries(env).filter(([name]) => !TELEMETRY_VARIABLE.test(name)));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The resource attributes a harness exporting telemetry of its own shares with alasio:
|
|
79
|
+
* the operator's `OTEL_RESOURCE_ATTRIBUTES`, which describe the deployment, without
|
|
80
|
+
* `service.name`, which is alasio's. The standard `key=value,key=value` list, or null.
|
|
81
|
+
*/
|
|
82
|
+
export function sharedResourceAttributes(env = process.env) {
|
|
83
|
+
const shared = (setting(env, "OTEL_RESOURCE_ATTRIBUTES") ?? "")
|
|
84
|
+
.split(",")
|
|
85
|
+
.filter((pair) => pair.trim() && pair.split("=")[0]?.trim() !== "service.name");
|
|
86
|
+
return shared.length ? shared.join(",") : null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The standard variables that have a process serving one conversation, Claude Code
|
|
90
|
+
* or bayma, export each signal alasio exports where alasio exports it, and no other:
|
|
91
|
+
* each exported signal's exporter, endpoint, protocol, and headers, every other
|
|
92
|
+
* signal's exporter none, and the deployment's resource attributes with the
|
|
93
|
+
* conversation's. Nothing when alasio exports nothing.
|
|
94
|
+
*/
|
|
95
|
+
export function conversationTelemetryEnv({ conversationId }, env = process.env) {
|
|
96
|
+
const telemetry = resolveTelemetry(env);
|
|
97
|
+
if (!telemetryEnabled(telemetry))
|
|
98
|
+
return {};
|
|
99
|
+
const settings = {
|
|
100
|
+
OTEL_RESOURCE_ATTRIBUTES: [sharedResourceAttributes(env), `alasio.conversation.id=${encodeURIComponent(conversationId)}`]
|
|
101
|
+
.filter(Boolean)
|
|
102
|
+
.join(","),
|
|
103
|
+
};
|
|
104
|
+
for (const signal of SIGNALS) {
|
|
105
|
+
const upper = signal.toUpperCase();
|
|
106
|
+
const exporter = telemetry[signal];
|
|
107
|
+
settings[`OTEL_${upper}_EXPORTER`] = exporter ? "otlp" : "none";
|
|
108
|
+
if (!exporter)
|
|
109
|
+
continue;
|
|
110
|
+
settings[`OTEL_EXPORTER_OTLP_${upper}_ENDPOINT`] = exporter.endpoint;
|
|
111
|
+
settings[`OTEL_EXPORTER_OTLP_${upper}_PROTOCOL`] = exporter.protocol;
|
|
112
|
+
if (exporter.headers)
|
|
113
|
+
settings[`OTEL_EXPORTER_OTLP_${upper}_HEADERS`] = exporter.headers;
|
|
114
|
+
}
|
|
115
|
+
return settings;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* A standard `key=value,key=value` list, such as OTLP headers or resource attributes, as
|
|
119
|
+
* an object, values URL-decoded.
|
|
120
|
+
*/
|
|
121
|
+
export function parseKeyValueList(list) {
|
|
122
|
+
if (!list)
|
|
123
|
+
return {};
|
|
124
|
+
return Object.fromEntries(list.split(",").flatMap((pair) => {
|
|
125
|
+
const at = pair.indexOf("=");
|
|
126
|
+
if (at <= 0)
|
|
127
|
+
return [];
|
|
128
|
+
return [[pair.slice(0, at).trim(), decodeURIComponent(pair.slice(at + 1).trim())]];
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/telemetry/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exports OTLP requests that something else encoded, as they are, over OTLP/HTTP to
|
|
3
|
+
* where alasio exports its own signals: what the sandbox service's receiver relays from
|
|
4
|
+
* inside a session's sandbox (src/receiver/receiver.ts). Each signal goes to its endpoint with its headers,
|
|
5
|
+
* timeout, compression, and TLS files from the standard variables, as OpenTelemetry's
|
|
6
|
+
* own exporters send alasio's, and is retried as they retry: on 429, 502, 503, and 504
|
|
7
|
+
* and on a failed connection, after the server's Retry-After or a jittered backoff,
|
|
8
|
+
* within the signal's timeout. alasio's deployment has it export to the stack's
|
|
9
|
+
* collector over OTLP/HTTP, which bayma exports over too.
|
|
10
|
+
*/
|
|
11
|
+
import { readFileSync } from "node:fs";
|
|
12
|
+
import { Agent as HttpAgent, request as httpRequest } from "node:http";
|
|
13
|
+
import { Agent as HttpsAgent, request as httpsRequest } from "node:https";
|
|
14
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
15
|
+
import { gzipSync } from "node:zlib";
|
|
16
|
+
import { context } from "@opentelemetry/api";
|
|
17
|
+
import { suppressTracing } from "@opentelemetry/core";
|
|
18
|
+
import { parseKeyValueList, resolveTelemetry, SIGNALS, signalSetting } from "./config.js";
|
|
19
|
+
const CONTENT_TYPES = { protobuf: "application/x-protobuf", json: "application/json" };
|
|
20
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
21
|
+
const RETRYABLE_STATUS = new Set([429, 502, 503, 504]);
|
|
22
|
+
const MAX_RETRIES = 5;
|
|
23
|
+
const INITIAL_BACKOFF_MS = 1000;
|
|
24
|
+
const MAX_BACKOFF_MS = 5000;
|
|
25
|
+
const BACKOFF_MULTIPLIER = 1.5;
|
|
26
|
+
const JITTER = 0.2;
|
|
27
|
+
// A response body is never needed, only drained; one this large is not an OTLP server's.
|
|
28
|
+
const MAX_RESPONSE_BYTES = 4 * 1024 * 1024;
|
|
29
|
+
/** The milliseconds a Retry-After header asks to wait, or null. */
|
|
30
|
+
export function retryAfterMs(header, now = Date.now()) {
|
|
31
|
+
if (!header)
|
|
32
|
+
return null;
|
|
33
|
+
const seconds = Number(header);
|
|
34
|
+
if (Number.isFinite(seconds) && seconds >= 0)
|
|
35
|
+
return seconds * 1000;
|
|
36
|
+
const at = Date.parse(header);
|
|
37
|
+
return Number.isNaN(at) ? null : Math.max(0, at - now);
|
|
38
|
+
}
|
|
39
|
+
const TLS_FILES = [["ca", "CERTIFICATE"], ["cert", "CLIENT_CERTIFICATE"], ["key", "CLIENT_KEY"]];
|
|
40
|
+
function tlsFiles(env, signal, warn) {
|
|
41
|
+
const files = {};
|
|
42
|
+
for (const [option, name] of TLS_FILES) {
|
|
43
|
+
const path = signalSetting(env, signal, name);
|
|
44
|
+
if (!path)
|
|
45
|
+
continue;
|
|
46
|
+
try {
|
|
47
|
+
files[option] = readFileSync(path);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
warn(`${signal}: cannot read OTEL_EXPORTER_OTLP_${name} ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return files;
|
|
54
|
+
}
|
|
55
|
+
/** How each exported signal is sent, from the standard variables. */
|
|
56
|
+
function signalTargets(env, warn) {
|
|
57
|
+
const telemetry = resolveTelemetry(env);
|
|
58
|
+
const targets = {};
|
|
59
|
+
for (const signal of SIGNALS) {
|
|
60
|
+
const exporter = telemetry[signal];
|
|
61
|
+
if (!exporter)
|
|
62
|
+
continue;
|
|
63
|
+
const url = new URL(exporter.endpoint);
|
|
64
|
+
const timeout = Number(signalSetting(env, signal, "TIMEOUT"));
|
|
65
|
+
const https = url.protocol === "https:";
|
|
66
|
+
targets[signal] = {
|
|
67
|
+
url,
|
|
68
|
+
protocol: exporter.protocol,
|
|
69
|
+
headers: parseKeyValueList(exporter.headers),
|
|
70
|
+
timeoutMs: Number.isFinite(timeout) && timeout > 0 ? timeout : DEFAULT_TIMEOUT_MS,
|
|
71
|
+
gzip: signalSetting(env, signal, "COMPRESSION") === "gzip",
|
|
72
|
+
request: https ? httpsRequest : httpRequest,
|
|
73
|
+
agent: https ? new HttpsAgent({ keepAlive: true, ...tlsFiles(env, signal, warn) }) : new HttpAgent({ keepAlive: true }),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return targets;
|
|
77
|
+
}
|
|
78
|
+
/** One POST: `{ status, retryAfter }`, or `{ error }` for a connection that failed. */
|
|
79
|
+
function post(target, body, headers, timeoutMs, signal) {
|
|
80
|
+
return new Promise((resolve) => {
|
|
81
|
+
// alasio's own HTTP instrumentation would otherwise trace every export it relays.
|
|
82
|
+
context.with(suppressTracing(context.active()), () => {
|
|
83
|
+
const req = target.request(target.url, { method: "POST", agent: target.agent, headers, timeout: timeoutMs, ...(signal ? { signal } : {}) }, (res) => {
|
|
84
|
+
let received = 0;
|
|
85
|
+
res.on("data", (chunk) => {
|
|
86
|
+
received += chunk.length;
|
|
87
|
+
if (received > MAX_RESPONSE_BYTES)
|
|
88
|
+
res.destroy();
|
|
89
|
+
});
|
|
90
|
+
res.on("error", () => { });
|
|
91
|
+
res.on("close", () => resolve({ status: res.statusCode, retryAfter: retryAfterMs(res.headers["retry-after"]) }));
|
|
92
|
+
});
|
|
93
|
+
req.on("timeout", () => req.destroy(new Error(`no response within ${timeoutMs}ms`)));
|
|
94
|
+
req.on("error", (error) => resolve({ error }));
|
|
95
|
+
req.end(body);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The forwarder for the signals `env` exports. `protocols` maps each signal it forwards
|
|
101
|
+
* to the protocol alasio exports it over (http/protobuf or http/json); a signal it does
|
|
102
|
+
* not forward is absent. `export(signal, encoding, body)` sends one request, encoded as
|
|
103
|
+
* `encoding` ("protobuf" or "json"), within the signal's timeout or `withinMs` where less,
|
|
104
|
+
* and resolves `{ ok: true }` once a server took it, or `{ ok: false, ... }` once it is given
|
|
105
|
+
* up on (ForwardResult), or `signal` aborts it, which ends the request it is sending.
|
|
106
|
+
* `close()` ends the connections it keeps open.
|
|
107
|
+
*/
|
|
108
|
+
export function createOtlpForwarder(env = process.env, { warn = () => { } } = {}) {
|
|
109
|
+
const targets = signalTargets(env, warn);
|
|
110
|
+
const protocols = {};
|
|
111
|
+
for (const signal of SIGNALS) {
|
|
112
|
+
const target = targets[signal];
|
|
113
|
+
if (target)
|
|
114
|
+
protocols[signal] = target.protocol;
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
protocols,
|
|
118
|
+
async export(signal, encoding, body, { withinMs, signal: abort } = {}) {
|
|
119
|
+
const target = targets[signal];
|
|
120
|
+
if (!target)
|
|
121
|
+
return { ok: false, error: `${signal} are not forwarded`, retryable: false, retryAfterMs: null };
|
|
122
|
+
const headers = {
|
|
123
|
+
...target.headers,
|
|
124
|
+
"content-type": CONTENT_TYPES[encoding],
|
|
125
|
+
...(target.gzip ? { "content-encoding": "gzip" } : {}),
|
|
126
|
+
};
|
|
127
|
+
const payload = target.gzip ? gzipSync(body) : body;
|
|
128
|
+
const deadline = Date.now() + Math.min(target.timeoutMs, withinMs ?? Infinity);
|
|
129
|
+
let backoff = INITIAL_BACKOFF_MS;
|
|
130
|
+
for (let attempt = 0;; attempt += 1) {
|
|
131
|
+
const result = await post(target, payload, headers, Math.max(1, deadline - Date.now()), abort);
|
|
132
|
+
if (result.status !== undefined && result.status >= 200 && result.status < 300)
|
|
133
|
+
return { ok: true };
|
|
134
|
+
const error = result.error?.message ?? `HTTP ${result.status}`;
|
|
135
|
+
const retryable = result.error || (result.status !== undefined && RETRYABLE_STATUS.has(result.status));
|
|
136
|
+
const failed = { ok: false, error, retryable: Boolean(retryable), retryAfterMs: result.retryAfter ?? null };
|
|
137
|
+
if (attempt === MAX_RETRIES || !retryable)
|
|
138
|
+
return failed;
|
|
139
|
+
const wait = result.retryAfter ?? Math.min(backoff * (1 + (Math.random() * 2 - 1) * JITTER), MAX_BACKOFF_MS);
|
|
140
|
+
backoff *= BACKOFF_MULTIPLIER;
|
|
141
|
+
if (Date.now() + wait >= deadline || abort?.aborted)
|
|
142
|
+
return failed;
|
|
143
|
+
const waited = await sleep(wait, true, abort ? { signal: abort } : {}).catch(() => false);
|
|
144
|
+
if (!waited)
|
|
145
|
+
return failed;
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
close() {
|
|
149
|
+
for (const target of Object.values(targets))
|
|
150
|
+
target.agent.destroy();
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=forward.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forward.js","sourceRoot":"","sources":["../../../../src/telemetry/forward.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { given, NAMESPACE, ONE, RELEASE, replicasOf } from "./common.js";
|
|
2
|
-
import { priority } from "./priorities.js";
|
|
3
|
-
import { verticalPodAutoscaler } from "./sizing.js";
|
|
4
|
-
import sandboxes from "./sandboxes.agents.x-k8s.io.json" with { type: "json" };
|
|
5
|
-
/**
|
|
6
|
-
* The Sandbox CRD, agents.x-k8s.io's `sandboxes`, as the API server takes it, whose
|
|
7
|
-
* schema's keys (`x-kubernetes-*`, say) are not client-node's model's.
|
|
8
|
-
*/
|
|
9
|
-
export const SANDBOX_CRD = sandboxes;
|
|
10
|
-
const NAME = `${RELEASE}-agent-sandbox-controller`;
|
|
11
|
-
/** The labels of the controller's objects: the controller's name and version, the installation, and alasio as their manager. */
|
|
12
|
-
const LABELS = {
|
|
13
|
-
"app.kubernetes.io/name": "agent-sandbox-controller",
|
|
14
|
-
"app.kubernetes.io/instance": RELEASE,
|
|
15
|
-
"app.kubernetes.io/version": "v1.0.5",
|
|
16
|
-
"app.kubernetes.io/managed-by": "alasio",
|
|
17
|
-
};
|
|
18
|
-
/** The controller: its identity, what it may do (Sandboxes and their pods, volumes and Services, cluster-wide; its leader lease, here), and its Deployment. */
|
|
19
|
-
function controller(config) {
|
|
20
|
-
const { image, resources, nodeSelector, tolerations, affinity } = config.agentSandbox;
|
|
21
|
-
const serviceAccount = { apiVersion: "v1", kind: "ServiceAccount", metadata: { name: NAME, namespace: NAMESPACE, labels: LABELS } };
|
|
22
|
-
const clusterRole = {
|
|
23
|
-
apiVersion: "rbac.authorization.k8s.io/v1",
|
|
24
|
-
kind: "ClusterRole",
|
|
25
|
-
metadata: { name: NAME, labels: LABELS },
|
|
26
|
-
rules: [
|
|
27
|
-
{ apiGroups: [""], resources: ["persistentvolumeclaims", "pods", "services"], verbs: ["create", "delete", "get", "list", "patch", "update", "watch"] },
|
|
28
|
-
{ apiGroups: ["", "events.k8s.io"], resources: ["events"], verbs: ["create", "patch"] },
|
|
29
|
-
{ apiGroups: ["agents.x-k8s.io"], resources: ["sandboxes"], verbs: ["create", "delete", "get", "list", "patch", "update", "watch"] },
|
|
30
|
-
{ apiGroups: ["agents.x-k8s.io"], resources: ["sandboxes/finalizers", "sandboxes/status"], verbs: ["get", "patch", "update"] },
|
|
31
|
-
],
|
|
32
|
-
};
|
|
33
|
-
const subjects = [{ kind: "ServiceAccount", name: NAME, namespace: NAMESPACE }];
|
|
34
|
-
const clusterRoleBinding = {
|
|
35
|
-
apiVersion: "rbac.authorization.k8s.io/v1",
|
|
36
|
-
kind: "ClusterRoleBinding",
|
|
37
|
-
metadata: { name: NAME, labels: LABELS },
|
|
38
|
-
subjects,
|
|
39
|
-
roleRef: { apiGroup: "rbac.authorization.k8s.io", kind: "ClusterRole", name: NAME },
|
|
40
|
-
};
|
|
41
|
-
// Leader election's lease, in the controller's own namespace only.
|
|
42
|
-
const role = {
|
|
43
|
-
apiVersion: "rbac.authorization.k8s.io/v1",
|
|
44
|
-
kind: "Role",
|
|
45
|
-
metadata: { name: NAME, namespace: NAMESPACE, labels: LABELS },
|
|
46
|
-
rules: [{ apiGroups: ["coordination.k8s.io"], resources: ["leases"], verbs: ["create", "get", "list", "patch", "update", "watch"] }],
|
|
47
|
-
};
|
|
48
|
-
const roleBinding = {
|
|
49
|
-
apiVersion: "rbac.authorization.k8s.io/v1",
|
|
50
|
-
kind: "RoleBinding",
|
|
51
|
-
metadata: { name: NAME, namespace: NAMESPACE, labels: LABELS },
|
|
52
|
-
subjects,
|
|
53
|
-
roleRef: { apiGroup: "rbac.authorization.k8s.io", kind: "Role", name: NAME },
|
|
54
|
-
};
|
|
55
|
-
const deployment = {
|
|
56
|
-
apiVersion: "apps/v1",
|
|
57
|
-
kind: "Deployment",
|
|
58
|
-
metadata: { name: NAME, namespace: NAMESPACE, labels: LABELS },
|
|
59
|
-
spec: {
|
|
60
|
-
...replicasOf(ONE),
|
|
61
|
-
selector: { matchLabels: { "app.kubernetes.io/name": "agent-sandbox-controller", "app.kubernetes.io/instance": RELEASE } },
|
|
62
|
-
template: {
|
|
63
|
-
metadata: { labels: LABELS },
|
|
64
|
-
spec: {
|
|
65
|
-
serviceAccountName: NAME,
|
|
66
|
-
...priority("floor"),
|
|
67
|
-
securityContext: { runAsNonRoot: true, seccompProfile: { type: "RuntimeDefault" } },
|
|
68
|
-
containers: [{
|
|
69
|
-
name: "controller",
|
|
70
|
-
image: `${image.repository}:${image.tag}${image.digest ? `@${image.digest}` : ""}`,
|
|
71
|
-
imagePullPolicy: image.pullPolicy,
|
|
72
|
-
args: ["--leader-elect=true"],
|
|
73
|
-
ports: [{ name: "metrics", containerPort: 8080 }, { name: "healthz", containerPort: 8081 }],
|
|
74
|
-
livenessProbe: { httpGet: { path: "/healthz", port: "healthz" } },
|
|
75
|
-
readinessProbe: { httpGet: { path: "/readyz", port: "healthz" } },
|
|
76
|
-
securityContext: { allowPrivilegeEscalation: false, readOnlyRootFilesystem: true, runAsNonRoot: true, capabilities: { drop: ["ALL"] } },
|
|
77
|
-
resources,
|
|
78
|
-
}],
|
|
79
|
-
...given("nodeSelector", { ...nodeSelector }),
|
|
80
|
-
...given("tolerations", [...tolerations]),
|
|
81
|
-
...given("affinity", affinity),
|
|
82
|
-
},
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
return [serviceAccount, clusterRole, clusterRoleBinding, role, roleBinding, deployment, verticalPodAutoscaler(deployment, "InPlace")];
|
|
87
|
-
}
|
|
88
|
-
/** agent-sandbox's objects, unless the cluster already has it. */
|
|
89
|
-
export function agentSandboxObjects(config) {
|
|
90
|
-
return config.agentSandbox.enabled ? [SANDBOX_CRD, ...controller(config)] : [];
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=agent-sandbox.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-sandbox.js","sourceRoot":"","sources":["../../../../src/manifests/agent-sandbox.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,SAAS,MAAM,kCAAkC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAqB,SAAS,CAAC;AAEvD,MAAM,IAAI,GAAG,GAAG,OAAO,2BAA2B,CAAC;AAEnD,gIAAgI;AAChI,MAAM,MAAM,GAAG;IACb,wBAAwB,EAAE,0BAA0B;IACpD,4BAA4B,EAAE,OAAO;IACrC,2BAA2B,EAAE,QAAQ;IACrC,8BAA8B,EAAE,QAAQ;CACzC,CAAC;AAEF,+JAA+J;AAC/J,SAAS,UAAU,CAAC,MAAqB;IACvC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC;IACtF,MAAM,cAAc,GAAqB,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACtJ,MAAM,WAAW,GAAkB;QACjC,UAAU,EAAE,8BAA8B;QAC1C,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;QACxC,KAAK,EAAE;YACL,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,wBAAwB,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;YACtJ,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE;YACvF,EAAE,SAAS,EAAE,CAAC,iBAAiB,CAAC,EAAE,SAAS,EAAE,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;YACpI,EAAE,SAAS,EAAE,CAAC,iBAAiB,CAAC,EAAE,SAAS,EAAE,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;SAC/H;KACF,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IAChF,MAAM,kBAAkB,GAAyB;QAC/C,UAAU,EAAE,8BAA8B;QAC1C,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;QACxC,QAAQ;QACR,OAAO,EAAE,EAAE,QAAQ,EAAE,2BAA2B,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE;KACpF,CAAC;IACF,mEAAmE;IACnE,MAAM,IAAI,GAAW;QACnB,UAAU,EAAE,8BAA8B;QAC1C,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;QAC9D,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,qBAAqB,CAAC,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;KACrI,CAAC;IACF,MAAM,WAAW,GAAkB;QACjC,UAAU,EAAE,8BAA8B;QAC1C,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;QAC9D,QAAQ;QACR,OAAO,EAAE,EAAE,QAAQ,EAAE,2BAA2B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;KAC7E,CAAC;IACF,MAAM,UAAU,GAAiB;QAC/B,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;QAC9D,IAAI,EAAE;YACJ,GAAG,UAAU,CAAC,GAAG,CAAC;YAClB,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,OAAO,EAAE,EAAE;YAC1H,QAAQ,EAAE;gBACR,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;gBAC5B,IAAI,EAAE;oBACJ,kBAAkB,EAAE,IAAI;oBACxB,GAAG,QAAQ,CAAC,OAAO,CAAC;oBACpB,eAAe,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE;oBACnF,UAAU,EAAE,CAAC;4BACX,IAAI,EAAE,YAAY;4BAClB,KAAK,EAAE,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;4BAClF,eAAe,EAAE,KAAK,CAAC,UAAU;4BACjC,IAAI,EAAE,CAAC,qBAAqB,CAAC;4BAC7B,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;4BAC3F,aAAa,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;4BACjE,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;4BACjE,eAAe,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE;4BACvI,SAAS;yBACV,CAAC;oBACF,GAAG,KAAK,CAAC,cAAc,EAAE,EAAE,GAAG,YAAY,EAAE,CAAC;oBAC7C,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;oBACzC,GAAG,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC;iBAC/B;aACF;SACF;KACF,CAAC;IACF,OAAO,CAAC,cAAc,EAAE,WAAW,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,qBAAqB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;AACxI,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,mBAAmB,CAAC,MAAqB;IACvD,OAAO,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACjF,CAAC"}
|