typekro 0.23.0 → 0.24.1
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/.tsbuildinfo +1 -1
- package/dist/core/deployment/kro-factory.d.ts +19 -0
- package/dist/core/deployment/kro-factory.d.ts.map +1 -1
- package/dist/core/deployment/kro-factory.js +60 -6
- package/dist/core/deployment/kro-factory.js.map +1 -1
- package/dist/core/proxy/create-resource.d.ts.map +1 -1
- package/dist/core/proxy/create-resource.js +37 -0
- package/dist/core/proxy/create-resource.js.map +1 -1
- package/dist/core/references/schema-proxy.d.ts.map +1 -1
- package/dist/core/references/schema-proxy.js +21 -5
- package/dist/core/references/schema-proxy.js.map +1 -1
- package/dist/factories/clickhouse/compositions/clickhouse-cluster.d.ts.map +1 -1
- package/dist/factories/clickhouse/compositions/clickhouse-cluster.js +47 -28
- package/dist/factories/clickhouse/compositions/clickhouse-cluster.js.map +1 -1
- package/dist/factories/clickhouse/types.d.ts +31 -0
- package/dist/factories/clickhouse/types.d.ts.map +1 -1
- package/dist/factories/clickhouse/types.js.map +1 -1
- package/dist/factories/clickstack/compositions/clickstack-bootstrap.d.ts +248 -0
- package/dist/factories/clickstack/compositions/clickstack-bootstrap.d.ts.map +1 -0
- package/dist/factories/clickstack/compositions/clickstack-bootstrap.js +257 -0
- package/dist/factories/clickstack/compositions/clickstack-bootstrap.js.map +1 -0
- package/dist/factories/clickstack/compositions/clickstack-helm-repository.d.ts +23 -0
- package/dist/factories/clickstack/compositions/clickstack-helm-repository.d.ts.map +1 -0
- package/dist/factories/clickstack/compositions/clickstack-helm-repository.js +36 -0
- package/dist/factories/clickstack/compositions/clickstack-helm-repository.js.map +1 -0
- package/dist/factories/clickstack/compositions/index.d.ts +5 -0
- package/dist/factories/clickstack/compositions/index.d.ts.map +1 -0
- package/dist/factories/clickstack/compositions/index.js +5 -0
- package/dist/factories/clickstack/compositions/index.js.map +1 -0
- package/dist/factories/clickstack/compositions/k8s-telemetry.d.ts +83 -0
- package/dist/factories/clickstack/compositions/k8s-telemetry.d.ts.map +1 -0
- package/dist/factories/clickstack/compositions/k8s-telemetry.js +134 -0
- package/dist/factories/clickstack/compositions/k8s-telemetry.js.map +1 -0
- package/dist/factories/clickstack/compositions/otel-helm-repository.d.ts +18 -0
- package/dist/factories/clickstack/compositions/otel-helm-repository.d.ts.map +1 -0
- package/dist/factories/clickstack/compositions/otel-helm-repository.js +31 -0
- package/dist/factories/clickstack/compositions/otel-helm-repository.js.map +1 -0
- package/dist/factories/clickstack/index.d.ts +40 -0
- package/dist/factories/clickstack/index.d.ts.map +1 -0
- package/dist/factories/clickstack/index.js +40 -0
- package/dist/factories/clickstack/index.js.map +1 -0
- package/dist/factories/clickstack/resources/helm.d.ts +78 -0
- package/dist/factories/clickstack/resources/helm.d.ts.map +1 -0
- package/dist/factories/clickstack/resources/helm.js +139 -0
- package/dist/factories/clickstack/resources/helm.js.map +1 -0
- package/dist/factories/clickstack/resources/index.d.ts +3 -0
- package/dist/factories/clickstack/resources/index.d.ts.map +1 -0
- package/dist/factories/clickstack/resources/index.js +3 -0
- package/dist/factories/clickstack/resources/index.js.map +1 -0
- package/dist/factories/clickstack/resources/mongo.d.ts +40 -0
- package/dist/factories/clickstack/resources/mongo.d.ts.map +1 -0
- package/dist/factories/clickstack/resources/mongo.js +122 -0
- package/dist/factories/clickstack/resources/mongo.js.map +1 -0
- package/dist/factories/clickstack/types.d.ts +485 -0
- package/dist/factories/clickstack/types.d.ts.map +1 -0
- package/dist/factories/clickstack/types.js +302 -0
- package/dist/factories/clickstack/types.js.map +1 -0
- package/dist/factories/clickstack/utils/helm-values-mapper.d.ts +118 -0
- package/dist/factories/clickstack/utils/helm-values-mapper.d.ts.map +1 -0
- package/dist/factories/clickstack/utils/helm-values-mapper.js +505 -0
- package/dist/factories/clickstack/utils/helm-values-mapper.js.map +1 -0
- package/dist/factories/clickstack/utils/index.d.ts +2 -0
- package/dist/factories/clickstack/utils/index.d.ts.map +1 -0
- package/dist/factories/clickstack/utils/index.js +2 -0
- package/dist/factories/clickstack/utils/index.js.map +1 -0
- package/dist/factories/index.d.ts +1 -0
- package/dist/factories/index.d.ts.map +1 -1
- package/dist/factories/index.js +4 -0
- package/dist/factories/index.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClickStack (HyperDX) Bootstrap Composition — EXTERNAL ClickHouse only.
|
|
3
|
+
*
|
|
4
|
+
* Deploys the OFFICIAL `clickstack` chart (3.0.x, MIT) from
|
|
5
|
+
* https://clickhouse.github.io/ClickStack-helm-charts via HelmRepository and
|
|
6
|
+
* HelmRelease resources. Build-around: we wrap the official chart — never
|
|
7
|
+
* hand-rolled manifests. NOT the archived hyperdxio/helm-charts repo, NOT the
|
|
8
|
+
* deprecated `hdx-oss-v2` chart, and NOT the `clickstack-operators`
|
|
9
|
+
* prerequisite chart (its ClickHouse operator CRDs would collide with the
|
|
10
|
+
* Altinity clickhouse-operator that manages our ClickHouseInstallation, and
|
|
11
|
+
* it drags in a MongoDB operator we don't want).
|
|
12
|
+
*
|
|
13
|
+
* BUILD-TIME vs RUNTIME: `makeClickstackBootstrap(options)` constructs a
|
|
14
|
+
* composition VARIANT. Options that decide WHICH resources exist (the Mongo
|
|
15
|
+
* mode + its storage shape) and the static raw chart values are build-time —
|
|
16
|
+
* plain JS may branch on them because they are always concrete. The runtime
|
|
17
|
+
* spec carries only proxy-safe values (names, namespaces, endpoints,
|
|
18
|
+
* versions, credentials); a user composing with `schema.spec.*` refs never
|
|
19
|
+
* hits a JS branch on a proxy.
|
|
20
|
+
*
|
|
21
|
+
* What gets deployed:
|
|
22
|
+
* 1. The target Namespace.
|
|
23
|
+
* 2. The shared ClickStack HelmRepository singleton.
|
|
24
|
+
* 3. Internal-Mongo variant only: a minimal single-replica Mongo
|
|
25
|
+
* StatefulSet + Service (`mongo:7`, no operator/CRDs/auth — APP METADATA
|
|
26
|
+
* ONLY, dev-first; see resources/mongo.ts for the loud caveats).
|
|
27
|
+
* 4. The clickstack HelmRelease: HyperDX (UI/API/OpAMP) + the OTel gateway
|
|
28
|
+
* collector subchart, wired to the EXTERNAL ClickHouse
|
|
29
|
+
* (`clickhouse.enabled: false` and `mongodb.enabled: false` are hard-pinned
|
|
30
|
+
* by the values mapper and beat the build-time values passthrough).
|
|
31
|
+
*
|
|
32
|
+
* STATUS CONTRACT: beyond ready/phase, the status exposes `ui.url`,
|
|
33
|
+
* `gateway.otlpHttpEndpoint` / `gateway.otlpGrpcEndpoint`, and
|
|
34
|
+
* `app.host/appPort/apiPort` so downstream compositions (e.g.
|
|
35
|
+
* `clickstackK8sTelemetry`) consume connection details without reconstructing
|
|
36
|
+
* chart naming rules. The mapper pins `fullnameOverride` to the release name
|
|
37
|
+
* to make that naming deterministic; endpoints are derived from the owned
|
|
38
|
+
* HelmRelease resource's metadata (never `schema.spec.*` — KRO status CEL
|
|
39
|
+
* cannot reference the instance spec).
|
|
40
|
+
*
|
|
41
|
+
* SCHEMA / REPLICATION CAVEAT: on first start the gateway collector's goose
|
|
42
|
+
* migrations create `otel_logs` / `otel_traces` / `otel_metrics_*` /
|
|
43
|
+
* `hyperdx_sessions` in the external ClickHouse as plain single-node
|
|
44
|
+
* MergeTree tables. That matches a 1-replica CHI (our dev-first sizing);
|
|
45
|
+
* multi-replica / `ON CLUSTER` schemas are NOT supported by ClickStack's
|
|
46
|
+
* tooling — revisit (and see `CLICKSTACK_CLICKHOUSE_GUIDANCE`) before scaling
|
|
47
|
+
* the CHI. Version coupling is loose: chart vendors CH 25.7, seed schemas
|
|
48
|
+
* carry a <26.2 compat variant, and the optional JSON-typed schema
|
|
49
|
+
* (`HYPERDX_OTEL_EXPORTER_CLICKHOUSE_JSON_ENABLE`) wants CH 25.3+.
|
|
50
|
+
*
|
|
51
|
+
* @example Internal Mongo (default)
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const factory = clickstackBootstrap.factory('kro', { namespace: 'clickstack' });
|
|
54
|
+
*
|
|
55
|
+
* await factory.deploy({
|
|
56
|
+
* name: 'clickstack',
|
|
57
|
+
* clickhouse: {
|
|
58
|
+
* host: 'clickhouse-observability.clickhouse.svc.cluster.local',
|
|
59
|
+
* username: 'otelcollector',
|
|
60
|
+
* password: '…',
|
|
61
|
+
* },
|
|
62
|
+
* });
|
|
63
|
+
* ```
|
|
64
|
+
*
|
|
65
|
+
* @example External Mongo (build-time variant)
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const bootstrap = makeClickstackBootstrap({ mongo: { mode: 'external' } });
|
|
68
|
+
*
|
|
69
|
+
* await bootstrap.factory('kro').deploy({
|
|
70
|
+
* name: 'clickstack',
|
|
71
|
+
* clickhouse: { host: '…' },
|
|
72
|
+
* mongoUri: 'mongodb://user:pass@mongo.example.com:27017/hyperdx',
|
|
73
|
+
* });
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
import { kubernetesComposition } from '../../../core/composition/imperative.js';
|
|
77
|
+
import { DEFAULT_FLUX_NAMESPACE } from '../../../core/config/defaults.js';
|
|
78
|
+
import { Cel } from '../../../core/references/cel.js';
|
|
79
|
+
import { singleton } from '../../../core/singleton/singleton.js';
|
|
80
|
+
import { containsKubernetesRefs, isKubernetesRef } from '../../../utils/type-guards.js';
|
|
81
|
+
import { namespace } from '../../kubernetes/core/namespace.js';
|
|
82
|
+
import { CLICKSTACK_API_PORT, CLICKSTACK_APP_PORT, CLICKSTACK_GATEWAY_NAME_SUFFIX, CLICKSTACK_OTLP_GRPC_PORT, CLICKSTACK_OTLP_HTTP_PORT, clickstackHelmRelease, DEFAULT_CLICKSTACK_REPO_NAME, DEFAULT_CLICKSTACK_REPO_URL, DEFAULT_CLICKSTACK_VERSION, } from '../resources/helm.js';
|
|
83
|
+
import { clickstackMongoService, clickstackMongoStatefulSet } from '../resources/mongo.js';
|
|
84
|
+
import { ClickStackBootstrapConfigSchema, ClickStackBootstrapStatusSchema, ClickStackExternalMongoBootstrapConfigSchema, } from '../types.js';
|
|
85
|
+
import { DEFAULT_CLICKSTACK_NAMESPACE, mapClickStackConfigToHelmValues, } from '../utils/helm-values-mapper.js';
|
|
86
|
+
import { clickstackHelmRepositoryBootstrap } from './clickstack-helm-repository.js';
|
|
87
|
+
/**
|
|
88
|
+
* Shared composition body. `build` is CONCRETE (construction-time), so every
|
|
89
|
+
* plain-JS branch below is on build config — never on the (possibly
|
|
90
|
+
* schema-proxy) runtime spec.
|
|
91
|
+
*
|
|
92
|
+
* NOTE: the variant builders pass INLINE delegating arrows
|
|
93
|
+
* (`(spec) => bootstrapBody(spec, build)`) to `kubernetesComposition` — a
|
|
94
|
+
* composition function that is itself a returned closure defeats the
|
|
95
|
+
* composition analyzer and mis-serializes mixed CEL templates (verified
|
|
96
|
+
* empirically: `Cel.template` values came out double-wrapped as
|
|
97
|
+
* `${tcp://${…}}`).
|
|
98
|
+
*/
|
|
99
|
+
function bootstrapBody(spec, build) {
|
|
100
|
+
{
|
|
101
|
+
const resolvedNamespace = isKubernetesRef(spec.namespace)
|
|
102
|
+
? Cel.default(spec.namespace, DEFAULT_CLICKSTACK_NAMESPACE)
|
|
103
|
+
: (spec.namespace ?? DEFAULT_CLICKSTACK_NAMESPACE);
|
|
104
|
+
const resolvedVersion = isKubernetesRef(spec.version)
|
|
105
|
+
? Cel.default(spec.version, DEFAULT_CLICKSTACK_VERSION)
|
|
106
|
+
: (spec.version ?? DEFAULT_CLICKSTACK_VERSION);
|
|
107
|
+
const helmValues = mapClickStackConfigToHelmValues(spec, {
|
|
108
|
+
mongoMode: build.mongoMode,
|
|
109
|
+
...(build.values !== undefined && { values: build.values }),
|
|
110
|
+
});
|
|
111
|
+
const _clickstackNamespace = namespace({
|
|
112
|
+
metadata: {
|
|
113
|
+
name: resolvedNamespace,
|
|
114
|
+
labels: {
|
|
115
|
+
'app.kubernetes.io/name': 'clickstack',
|
|
116
|
+
'app.kubernetes.io/instance': spec.name,
|
|
117
|
+
'app.kubernetes.io/managed-by': 'typekro',
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
id: 'clickstackNamespace',
|
|
121
|
+
});
|
|
122
|
+
// One cluster-level Flux source shared by every ClickStack instance —
|
|
123
|
+
// singleton(...) keeps it out of any single instance's KRO ApplySet
|
|
124
|
+
// (see clickstack-helm-repository.ts for the ownership rationale).
|
|
125
|
+
const _clickstackHelmRepository = singleton(clickstackHelmRepositoryBootstrap, {
|
|
126
|
+
id: 'clickstack-helm-repository',
|
|
127
|
+
spec: {
|
|
128
|
+
name: DEFAULT_CLICKSTACK_REPO_NAME,
|
|
129
|
+
namespace: DEFAULT_FLUX_NAMESPACE,
|
|
130
|
+
url: DEFAULT_CLICKSTACK_REPO_URL,
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
// ── Internal Mongo (build-time variant) ─────────────────────────────
|
|
134
|
+
if (build.mongoMode === 'internal') {
|
|
135
|
+
const _mongoStatefulSet = clickstackMongoStatefulSet({
|
|
136
|
+
name: spec.name,
|
|
137
|
+
namespace: resolvedNamespace,
|
|
138
|
+
...(build.storage?.size !== undefined && { storageSize: build.storage.size }),
|
|
139
|
+
...(build.storage?.storageClassName !== undefined && {
|
|
140
|
+
storageClassName: build.storage.storageClassName,
|
|
141
|
+
}),
|
|
142
|
+
statefulSetId: 'clickstackMongoStatefulSet',
|
|
143
|
+
});
|
|
144
|
+
const _mongoService = clickstackMongoService({
|
|
145
|
+
name: spec.name,
|
|
146
|
+
namespace: resolvedNamespace,
|
|
147
|
+
serviceId: 'clickstackMongoService',
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
// ── ClickStack HelmRelease ───────────────────────────────────────────
|
|
151
|
+
//
|
|
152
|
+
// The HelmRelease does not set `disableWait`, so helm-controller waits
|
|
153
|
+
// for the chart's workloads (HyperDX app + gateway collector) before
|
|
154
|
+
// reporting Ready — readiness is workload-aware, mirroring the
|
|
155
|
+
// dagster/clickhouse bootstraps. The HyperDX pod's own waitForMongodb
|
|
156
|
+
// init container gates on Mongo reachability, so no explicit dependency
|
|
157
|
+
// on the internal Mongo is needed.
|
|
158
|
+
const _clickstackHelmRelease = clickstackHelmRelease({
|
|
159
|
+
name: spec.name,
|
|
160
|
+
namespace: resolvedNamespace,
|
|
161
|
+
version: resolvedVersion,
|
|
162
|
+
values: helmValues,
|
|
163
|
+
id: 'clickstackHelmRelease',
|
|
164
|
+
});
|
|
165
|
+
const helmReleaseReady = Cel.expr(_clickstackHelmRelease.status.conditions, '.exists(c, c.type == "Ready" && c.status == "True")');
|
|
166
|
+
// Status endpoints derive from the owned HelmRelease resource so they
|
|
167
|
+
// serialize as KRO status CEL and land on the live KRO CR's status
|
|
168
|
+
// (same reachability class as the PR #93 review finding). Naming is
|
|
169
|
+
// deterministic because the mapper pins `fullnameOverride` to the release
|
|
170
|
+
// name: HyperDX Service = `<name>`, gateway Service =
|
|
171
|
+
// `<name>-otel-collector`. Ports are chart defaults (see resources/helm.ts)
|
|
172
|
+
// and ride INSIDE the resource-derived URL strings.
|
|
173
|
+
//
|
|
174
|
+
// These use NATURAL proxy access inside JS template literals (typekro
|
|
175
|
+
// >= 0.24.0, with the #97 resource-metadata-proxy fix). In KRO mode the
|
|
176
|
+
// imperative analyzer converts them to status CEL and (#97)
|
|
177
|
+
// `clickstackHelmRelease.metadata.*` resolves resource-anchored instead
|
|
178
|
+
// of degrading to `schema.spec.name`; in direct mode they are plain JS,
|
|
179
|
+
// so live-status re-execution evaluates them to concrete strings — the
|
|
180
|
+
// bimodal win over the old raw `Cel.expr("...literal CEL...")` strings,
|
|
181
|
+
// which stayed opaque markers in direct mode. `ready`/`phase` below stay
|
|
182
|
+
// raw Cel.expr: they use the CEL `.exists()` macro over the HelmRelease
|
|
183
|
+
// conditions, which has no analyzer-convertible JS equivalent — so they are
|
|
184
|
+
// NOT natural template literals. They still resolve in BOTH modes, though:
|
|
185
|
+
// KRO status CEL in kro mode, and the cel-js reference resolver evaluates
|
|
186
|
+
// the `.exists()` macro against the live HelmRelease conditions in direct
|
|
187
|
+
// mode (proven concrete — ready===true / phase==="Ready" — in the hermetic
|
|
188
|
+
// final-pipeline test). Unchanged by this migration: raw Cel.expr before
|
|
189
|
+
// and after; only the metadata endpoint fields switched to template literals.
|
|
190
|
+
return {
|
|
191
|
+
ready: helmReleaseReady,
|
|
192
|
+
phase: Cel.expr('clickstackHelmRelease.status.conditions.exists(c, c.type == "Ready" && c.status == "False") ' +
|
|
193
|
+
'? "Failed" : clickstackHelmRelease.status.conditions.exists(c, c.type == "Ready" && ' +
|
|
194
|
+
'c.status == "True") ? "Ready" : "Installing"'),
|
|
195
|
+
version: resolvedVersion,
|
|
196
|
+
ui: {
|
|
197
|
+
url: `http://${_clickstackHelmRelease.metadata.name}.${_clickstackHelmRelease.metadata.namespace}.svc.cluster.local:${CLICKSTACK_APP_PORT}`,
|
|
198
|
+
},
|
|
199
|
+
gateway: {
|
|
200
|
+
otlpHttpEndpoint: `http://${_clickstackHelmRelease.metadata.name}${CLICKSTACK_GATEWAY_NAME_SUFFIX}.${_clickstackHelmRelease.metadata.namespace}.svc.cluster.local:${CLICKSTACK_OTLP_HTTP_PORT}`,
|
|
201
|
+
otlpGrpcEndpoint: `http://${_clickstackHelmRelease.metadata.name}${CLICKSTACK_GATEWAY_NAME_SUFFIX}.${_clickstackHelmRelease.metadata.namespace}.svc.cluster.local:${CLICKSTACK_OTLP_GRPC_PORT}`,
|
|
202
|
+
},
|
|
203
|
+
app: {
|
|
204
|
+
host: `${_clickstackHelmRelease.metadata.name}.${_clickstackHelmRelease.metadata.namespace}.svc.cluster.local`,
|
|
205
|
+
// Bare numeric constants — no resource anchor, so client-hydrated
|
|
206
|
+
// only; both ports are KRO-visible inside the URL fields above.
|
|
207
|
+
appPort: CLICKSTACK_APP_PORT,
|
|
208
|
+
apiPort: CLICKSTACK_API_PORT,
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function buildInternalComposition(options) {
|
|
214
|
+
const build = {
|
|
215
|
+
mongoMode: 'internal',
|
|
216
|
+
...(options.mongo?.storage !== undefined && { storage: options.mongo.storage }),
|
|
217
|
+
...(options.values !== undefined && { values: options.values }),
|
|
218
|
+
};
|
|
219
|
+
return kubernetesComposition({
|
|
220
|
+
name: options.name ?? 'clickstack-bootstrap',
|
|
221
|
+
kind: options.kind ?? 'ClickStackBootstrap',
|
|
222
|
+
spec: ClickStackBootstrapConfigSchema,
|
|
223
|
+
status: ClickStackBootstrapStatusSchema,
|
|
224
|
+
}, (spec) => bootstrapBody(spec, build));
|
|
225
|
+
}
|
|
226
|
+
function buildExternalComposition(options) {
|
|
227
|
+
const build = {
|
|
228
|
+
mongoMode: 'external',
|
|
229
|
+
...(options.values !== undefined && { values: options.values }),
|
|
230
|
+
};
|
|
231
|
+
return kubernetesComposition({
|
|
232
|
+
name: options.name ?? 'clickstack-bootstrap-external-mongo',
|
|
233
|
+
kind: options.kind ?? 'ClickStackExternalMongoBootstrap',
|
|
234
|
+
spec: ClickStackExternalMongoBootstrapConfigSchema,
|
|
235
|
+
status: ClickStackBootstrapStatusSchema,
|
|
236
|
+
}, (spec) => bootstrapBody(spec, build));
|
|
237
|
+
}
|
|
238
|
+
export function makeClickstackBootstrap(options = {}) {
|
|
239
|
+
// Build-time options must be CONCRETE: they select which resources exist and bake static chart
|
|
240
|
+
// values at construction — a schema ref here can never serialize (loud > silent mis-serialization).
|
|
241
|
+
if (containsKubernetesRefs(options)) {
|
|
242
|
+
throw new Error('makeClickstackBootstrap: build-time options contain a schema/resource reference. ' +
|
|
243
|
+
'Build-time options (mongo mode/storage, static chart values, name/kind) are fixed at ' +
|
|
244
|
+
'construction — move per-instance values into the runtime spec instead.');
|
|
245
|
+
}
|
|
246
|
+
if (options.mongo?.mode === 'external') {
|
|
247
|
+
return buildExternalComposition(options);
|
|
248
|
+
}
|
|
249
|
+
return buildInternalComposition(options);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* The default ClickStack bootstrap: internal single-replica Mongo (dev-first),
|
|
253
|
+
* default RGD name/kind. Use `makeClickstackBootstrap(...)` for the
|
|
254
|
+
* external-Mongo variant, custom Mongo storage, or static raw chart values.
|
|
255
|
+
*/
|
|
256
|
+
export const clickstackBootstrap = makeClickstackBootstrap();
|
|
257
|
+
//# sourceMappingURL=clickstack-bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickstack-bootstrap.js","sourceRoot":"","sources":["../../../../src/factories/clickstack/compositions/clickstack-bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared ClickStack HelmRepository singleton.
|
|
3
|
+
*
|
|
4
|
+
* The official ClickStack chart repository
|
|
5
|
+
* (https://clickhouse.github.io/ClickStack-helm-charts) is a single
|
|
6
|
+
* cluster-level Flux source — the same URL serves every consumer. Deploying it
|
|
7
|
+
* inline in the `clickstackBootstrap` RGD would make each instance's KRO
|
|
8
|
+
* ApplySet try to *own* the HelmRepository exclusively, so a second instance
|
|
9
|
+
* of the RGD fails to reconcile ("resource belongs to a different ApplySet
|
|
10
|
+
* ... cannot reassign"). Modelling the repository as its own composition lets
|
|
11
|
+
* the bootstrap consume it via `singleton(...)`, so one shared HelmRepository
|
|
12
|
+
* is owned outside any single instance's ApplySet and every instance's
|
|
13
|
+
* HelmRelease references it by the same `sourceRef`. (Same pattern as the
|
|
14
|
+
* dagster/clickhouse bootstraps' shared repositories.)
|
|
15
|
+
*/
|
|
16
|
+
export declare const clickstackHelmRepositoryBootstrap: import("../../../index.js").CallableComposition<{
|
|
17
|
+
name: string;
|
|
18
|
+
namespace: string;
|
|
19
|
+
url: string;
|
|
20
|
+
}, {
|
|
21
|
+
ready: boolean;
|
|
22
|
+
}>;
|
|
23
|
+
//# sourceMappingURL=clickstack-helm-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickstack-helm-repository.d.ts","sourceRoot":"","sources":["../../../../src/factories/clickstack/compositions/clickstack-helm-repository.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iCAAiC;;;;;;EAsB7C,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { kubernetesComposition } from '../../../core/composition/imperative.js';
|
|
2
|
+
import { Cel } from '../../../core/references/cel.js';
|
|
3
|
+
import { clickstackHelmRepository } from '../resources/helm.js';
|
|
4
|
+
import { ClickStackHelmRepositorySingletonSpecSchema, ClickStackHelmRepositorySingletonStatusSchema, } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Shared ClickStack HelmRepository singleton.
|
|
7
|
+
*
|
|
8
|
+
* The official ClickStack chart repository
|
|
9
|
+
* (https://clickhouse.github.io/ClickStack-helm-charts) is a single
|
|
10
|
+
* cluster-level Flux source — the same URL serves every consumer. Deploying it
|
|
11
|
+
* inline in the `clickstackBootstrap` RGD would make each instance's KRO
|
|
12
|
+
* ApplySet try to *own* the HelmRepository exclusively, so a second instance
|
|
13
|
+
* of the RGD fails to reconcile ("resource belongs to a different ApplySet
|
|
14
|
+
* ... cannot reassign"). Modelling the repository as its own composition lets
|
|
15
|
+
* the bootstrap consume it via `singleton(...)`, so one shared HelmRepository
|
|
16
|
+
* is owned outside any single instance's ApplySet and every instance's
|
|
17
|
+
* HelmRelease references it by the same `sourceRef`. (Same pattern as the
|
|
18
|
+
* dagster/clickhouse bootstraps' shared repositories.)
|
|
19
|
+
*/
|
|
20
|
+
export const clickstackHelmRepositoryBootstrap = kubernetesComposition({
|
|
21
|
+
name: 'clickstack-helm-repository',
|
|
22
|
+
kind: 'ClickStackHelmRepository',
|
|
23
|
+
spec: ClickStackHelmRepositorySingletonSpecSchema,
|
|
24
|
+
status: ClickStackHelmRepositorySingletonStatusSchema,
|
|
25
|
+
}, (spec) => {
|
|
26
|
+
const repository = clickstackHelmRepository({
|
|
27
|
+
name: spec.name,
|
|
28
|
+
namespace: spec.namespace,
|
|
29
|
+
url: spec.url,
|
|
30
|
+
id: 'repository',
|
|
31
|
+
});
|
|
32
|
+
return {
|
|
33
|
+
ready: Cel.expr(repository.status.conditions, '.exists(c, c.type == "Ready" && c.status == "True")'),
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=clickstack-helm-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickstack-helm-repository.js","sourceRoot":"","sources":["../../../../src/factories/clickstack/compositions/clickstack-helm-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EACL,2CAA2C,EAC3C,6CAA6C,GAC9C,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,qBAAqB,CACpE;IACE,IAAI,EAAE,4BAA4B;IAClC,IAAI,EAAE,0BAA0B;IAChC,IAAI,EAAE,2CAA2C;IACjD,MAAM,EAAE,6CAA6C;CACtD,EACD,CAAC,IAAI,EAAE,EAAE;IACP,MAAM,UAAU,GAAG,wBAAwB,CAAC;QAC1C,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,EAAE,EAAE,YAAY;KACjB,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,IAAI,CACb,UAAU,CAAC,MAAM,CAAC,UAAU,EAC5B,qDAAqD,CACtD;KACF,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/factories/clickstack/compositions/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/factories/clickstack/compositions/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClickStack Kubernetes Telemetry Composition.
|
|
3
|
+
*
|
|
4
|
+
* The documented ClickStack pattern for collecting cluster telemetry
|
|
5
|
+
* (https://clickhouse.com/docs/use-cases/observability/clickstack/ingesting-data/kubernetes):
|
|
6
|
+
* TWO instances of the STOCK `opentelemetry-collector` chart from
|
|
7
|
+
* https://open-telemetry.github.io/opentelemetry-helm-charts —
|
|
8
|
+
*
|
|
9
|
+
* 1. A DAEMONSET instance on every node: presets `logsCollection`,
|
|
10
|
+
* `hostMetrics`, `kubernetesAttributes`, `kubeletMetrics` (+ the
|
|
11
|
+
* docs-recommended kubeletstats utilization metrics).
|
|
12
|
+
* 2. A DEPLOYMENT instance (single replica): presets `kubernetesAttributes`,
|
|
13
|
+
* `kubernetesEvents`, `clusterMetrics`.
|
|
14
|
+
*
|
|
15
|
+
* Both export `otlphttp` to the ClickStack gateway collector (default: the
|
|
16
|
+
* in-cluster `clickstack-otel-collector` Service on 4318 — prefer wiring
|
|
17
|
+
* `stack.status.gateway.otlpHttpEndpoint` from the bootstrap's status
|
|
18
|
+
* contract) authenticated with an `authorization: <HYPERDX_API_KEY>` header.
|
|
19
|
+
* The key is delivered via a `secretKeyRef` env var and referenced through
|
|
20
|
+
* OTel `${env:…}` config expansion, so the key value never lands in Helm
|
|
21
|
+
* values.
|
|
22
|
+
*
|
|
23
|
+
* BUILD-TIME vs RUNTIME: per-instance raw chart values are BUILD-TIME options
|
|
24
|
+
* on `makeClickstackK8sTelemetry(...)` (a free-form values tree cannot be
|
|
25
|
+
* represented per-instance in a KRO schema without silently dropping it);
|
|
26
|
+
* the runtime spec carries only proxy-safe values (name, namespace, version,
|
|
27
|
+
* endpoint, apiKeySecret coordinates).
|
|
28
|
+
*
|
|
29
|
+
* This is deliberately NOT the clickstack chart — the gateway collector ships
|
|
30
|
+
* with `clickstackBootstrap`; these are the per-cluster edge collectors.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const factory = clickstackK8sTelemetry.factory('kro', {
|
|
35
|
+
* namespace: 'clickstack-telemetry',
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* await factory.deploy({
|
|
39
|
+
* name: 'clickstack-telemetry',
|
|
40
|
+
* apiKeySecret: { name: 'hyperdx-secret' },
|
|
41
|
+
* endpoint: stack.status.gateway.otlpHttpEndpoint,
|
|
42
|
+
* });
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
import { type ClickStackK8sTelemetryBuildOptions } from '../types.js';
|
|
46
|
+
/**
|
|
47
|
+
* Construct a k8s telemetry composition. Build-time options bake static raw
|
|
48
|
+
* chart values per collector instance; everything per-instance stays in the
|
|
49
|
+
* runtime spec.
|
|
50
|
+
*/
|
|
51
|
+
export declare function makeClickstackK8sTelemetry(options?: ClickStackK8sTelemetryBuildOptions): import("../../../index.js").CallableComposition<{
|
|
52
|
+
name: string;
|
|
53
|
+
apiKeySecret: {
|
|
54
|
+
name: string;
|
|
55
|
+
key?: string;
|
|
56
|
+
};
|
|
57
|
+
namespace?: string;
|
|
58
|
+
version?: string;
|
|
59
|
+
endpoint?: string;
|
|
60
|
+
}, {
|
|
61
|
+
ready: boolean;
|
|
62
|
+
phase: "Ready" | "Installing";
|
|
63
|
+
}>;
|
|
64
|
+
/** Composition type for the k8s telemetry pair. */
|
|
65
|
+
export type ClickStackK8sTelemetryComposition = ReturnType<typeof makeClickstackK8sTelemetry>;
|
|
66
|
+
/**
|
|
67
|
+
* The default k8s telemetry composition (no build-time value overrides).
|
|
68
|
+
* Use `makeClickstackK8sTelemetry(...)` to bake per-instance raw chart values.
|
|
69
|
+
*/
|
|
70
|
+
export declare const clickstackK8sTelemetry: import("../../../index.js").CallableComposition<{
|
|
71
|
+
name: string;
|
|
72
|
+
apiKeySecret: {
|
|
73
|
+
name: string;
|
|
74
|
+
key?: string;
|
|
75
|
+
};
|
|
76
|
+
namespace?: string;
|
|
77
|
+
version?: string;
|
|
78
|
+
endpoint?: string;
|
|
79
|
+
}, {
|
|
80
|
+
ready: boolean;
|
|
81
|
+
phase: "Ready" | "Installing";
|
|
82
|
+
}>;
|
|
83
|
+
//# sourceMappingURL=k8s-telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s-telemetry.d.ts","sourceRoot":"","sources":["../../../../src/factories/clickstack/compositions/k8s-telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAcH,OAAO,EACL,KAAK,kCAAkC,EAIxC,MAAM,aAAa,CAAC;AAOrB;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,kCAAuC;;;;;;;;;;;;GAoF1F;AAED,mDAAmD;AACnD,MAAM,MAAM,iCAAiC,GAAG,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9F;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAA+B,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClickStack Kubernetes Telemetry Composition.
|
|
3
|
+
*
|
|
4
|
+
* The documented ClickStack pattern for collecting cluster telemetry
|
|
5
|
+
* (https://clickhouse.com/docs/use-cases/observability/clickstack/ingesting-data/kubernetes):
|
|
6
|
+
* TWO instances of the STOCK `opentelemetry-collector` chart from
|
|
7
|
+
* https://open-telemetry.github.io/opentelemetry-helm-charts —
|
|
8
|
+
*
|
|
9
|
+
* 1. A DAEMONSET instance on every node: presets `logsCollection`,
|
|
10
|
+
* `hostMetrics`, `kubernetesAttributes`, `kubeletMetrics` (+ the
|
|
11
|
+
* docs-recommended kubeletstats utilization metrics).
|
|
12
|
+
* 2. A DEPLOYMENT instance (single replica): presets `kubernetesAttributes`,
|
|
13
|
+
* `kubernetesEvents`, `clusterMetrics`.
|
|
14
|
+
*
|
|
15
|
+
* Both export `otlphttp` to the ClickStack gateway collector (default: the
|
|
16
|
+
* in-cluster `clickstack-otel-collector` Service on 4318 — prefer wiring
|
|
17
|
+
* `stack.status.gateway.otlpHttpEndpoint` from the bootstrap's status
|
|
18
|
+
* contract) authenticated with an `authorization: <HYPERDX_API_KEY>` header.
|
|
19
|
+
* The key is delivered via a `secretKeyRef` env var and referenced through
|
|
20
|
+
* OTel `${env:…}` config expansion, so the key value never lands in Helm
|
|
21
|
+
* values.
|
|
22
|
+
*
|
|
23
|
+
* BUILD-TIME vs RUNTIME: per-instance raw chart values are BUILD-TIME options
|
|
24
|
+
* on `makeClickstackK8sTelemetry(...)` (a free-form values tree cannot be
|
|
25
|
+
* represented per-instance in a KRO schema without silently dropping it);
|
|
26
|
+
* the runtime spec carries only proxy-safe values (name, namespace, version,
|
|
27
|
+
* endpoint, apiKeySecret coordinates).
|
|
28
|
+
*
|
|
29
|
+
* This is deliberately NOT the clickstack chart — the gateway collector ships
|
|
30
|
+
* with `clickstackBootstrap`; these are the per-cluster edge collectors.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const factory = clickstackK8sTelemetry.factory('kro', {
|
|
35
|
+
* namespace: 'clickstack-telemetry',
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* await factory.deploy({
|
|
39
|
+
* name: 'clickstack-telemetry',
|
|
40
|
+
* apiKeySecret: { name: 'hyperdx-secret' },
|
|
41
|
+
* endpoint: stack.status.gateway.otlpHttpEndpoint,
|
|
42
|
+
* });
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
import { kubernetesComposition } from '../../../core/composition/imperative.js';
|
|
46
|
+
import { DEFAULT_FLUX_NAMESPACE } from '../../../core/config/defaults.js';
|
|
47
|
+
import { Cel } from '../../../core/references/cel.js';
|
|
48
|
+
import { singleton } from '../../../core/singleton/singleton.js';
|
|
49
|
+
import { containsKubernetesRefs, isKubernetesRef } from '../../../utils/type-guards.js';
|
|
50
|
+
import { namespace } from '../../kubernetes/core/namespace.js';
|
|
51
|
+
import { DEFAULT_OTEL_COLLECTOR_VERSION, DEFAULT_OTEL_REPO_NAME, DEFAULT_OTEL_REPO_URL, otelCollectorHelmRelease, } from '../resources/helm.js';
|
|
52
|
+
import { ClickStackK8sTelemetryConfigSchema, ClickStackK8sTelemetryStatusSchema, } from '../types.js';
|
|
53
|
+
import { DEFAULT_CLICKSTACK_TELEMETRY_NAMESPACE, mapK8sTelemetryConfigToHelmValues, } from '../utils/helm-values-mapper.js';
|
|
54
|
+
import { otelHelmRepositoryBootstrap } from './otel-helm-repository.js';
|
|
55
|
+
/**
|
|
56
|
+
* Construct a k8s telemetry composition. Build-time options bake static raw
|
|
57
|
+
* chart values per collector instance; everything per-instance stays in the
|
|
58
|
+
* runtime spec.
|
|
59
|
+
*/
|
|
60
|
+
export function makeClickstackK8sTelemetry(options = {}) {
|
|
61
|
+
// Build-time options must be CONCRETE (see makeClickstackBootstrap): per-instance values belong
|
|
62
|
+
// in the runtime spec.
|
|
63
|
+
if (containsKubernetesRefs(options)) {
|
|
64
|
+
throw new Error('makeClickstackK8sTelemetry: build-time options contain a schema/resource reference. ' +
|
|
65
|
+
'Move per-instance values into the runtime spec instead.');
|
|
66
|
+
}
|
|
67
|
+
return kubernetesComposition({
|
|
68
|
+
name: options.name ?? 'clickstack-k8s-telemetry',
|
|
69
|
+
kind: options.kind ?? 'ClickStackK8sTelemetry',
|
|
70
|
+
spec: ClickStackK8sTelemetryConfigSchema,
|
|
71
|
+
status: ClickStackK8sTelemetryStatusSchema,
|
|
72
|
+
}, (spec) => {
|
|
73
|
+
const resolvedNamespace = isKubernetesRef(spec.namespace)
|
|
74
|
+
? Cel.default(spec.namespace, DEFAULT_CLICKSTACK_TELEMETRY_NAMESPACE)
|
|
75
|
+
: (spec.namespace ?? DEFAULT_CLICKSTACK_TELEMETRY_NAMESPACE);
|
|
76
|
+
const resolvedVersion = isKubernetesRef(spec.version)
|
|
77
|
+
? Cel.default(spec.version, DEFAULT_OTEL_COLLECTOR_VERSION)
|
|
78
|
+
: (spec.version ?? DEFAULT_OTEL_COLLECTOR_VERSION);
|
|
79
|
+
const { daemonset: daemonsetValues, deployment: deploymentValues } = mapK8sTelemetryConfigToHelmValues(spec, {
|
|
80
|
+
...(options.daemonset !== undefined && { daemonset: options.daemonset }),
|
|
81
|
+
...(options.deployment !== undefined && { deployment: options.deployment }),
|
|
82
|
+
});
|
|
83
|
+
const _telemetryNamespace = namespace({
|
|
84
|
+
metadata: {
|
|
85
|
+
name: resolvedNamespace,
|
|
86
|
+
labels: {
|
|
87
|
+
'app.kubernetes.io/name': 'clickstack-k8s-telemetry',
|
|
88
|
+
'app.kubernetes.io/instance': spec.name,
|
|
89
|
+
'app.kubernetes.io/managed-by': 'typekro',
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
id: 'clickstackTelemetryNamespace',
|
|
93
|
+
});
|
|
94
|
+
// Shared cluster-level OTel chart repository singleton (ApplySet
|
|
95
|
+
// ownership rationale documented on otelHelmRepositoryBootstrap).
|
|
96
|
+
const _otelHelmRepository = singleton(otelHelmRepositoryBootstrap, {
|
|
97
|
+
id: 'opentelemetry-helm-repository',
|
|
98
|
+
spec: {
|
|
99
|
+
name: DEFAULT_OTEL_REPO_NAME,
|
|
100
|
+
namespace: DEFAULT_FLUX_NAMESPACE,
|
|
101
|
+
url: DEFAULT_OTEL_REPO_URL,
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
// Template-literal names work in both modes: concrete strings in direct
|
|
105
|
+
// mode, marker tokens rewritten to CEL in KRO mode (searxng precedent).
|
|
106
|
+
const _daemonsetRelease = otelCollectorHelmRelease({
|
|
107
|
+
name: `${spec.name}-daemonset`,
|
|
108
|
+
namespace: resolvedNamespace,
|
|
109
|
+
version: resolvedVersion,
|
|
110
|
+
values: daemonsetValues,
|
|
111
|
+
id: 'clickstackTelemetryDaemonset',
|
|
112
|
+
});
|
|
113
|
+
const _deploymentRelease = otelCollectorHelmRelease({
|
|
114
|
+
name: `${spec.name}-deployment`,
|
|
115
|
+
namespace: resolvedNamespace,
|
|
116
|
+
version: resolvedVersion,
|
|
117
|
+
values: deploymentValues,
|
|
118
|
+
id: 'clickstackTelemetryDeployment',
|
|
119
|
+
});
|
|
120
|
+
return {
|
|
121
|
+
ready: Cel.expr('clickstackTelemetryDaemonset.status.conditions.exists(c, c.type == "Ready" && c.status == "True") && ' +
|
|
122
|
+
'clickstackTelemetryDeployment.status.conditions.exists(c, c.type == "Ready" && c.status == "True")'),
|
|
123
|
+
phase: Cel.expr('clickstackTelemetryDaemonset.status.conditions.exists(c, c.type == "Ready" && c.status == "True") && ' +
|
|
124
|
+
'clickstackTelemetryDeployment.status.conditions.exists(c, c.type == "Ready" && c.status == "True") ' +
|
|
125
|
+
'? "Ready" : "Installing"'),
|
|
126
|
+
};
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* The default k8s telemetry composition (no build-time value overrides).
|
|
131
|
+
* Use `makeClickstackK8sTelemetry(...)` to bake per-instance raw chart values.
|
|
132
|
+
*/
|
|
133
|
+
export const clickstackK8sTelemetry = makeClickstackK8sTelemetry();
|
|
134
|
+
//# sourceMappingURL=k8s-telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s-telemetry.js","sourceRoot":"","sources":["../../../../src/factories/clickstack/compositions/k8s-telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared OpenTelemetry HelmRepository singleton.
|
|
3
|
+
*
|
|
4
|
+
* The official OpenTelemetry chart repository
|
|
5
|
+
* (https://open-telemetry.github.io/opentelemetry-helm-charts) is a single
|
|
6
|
+
* cluster-level Flux source shared by every `clickstackK8sTelemetry` instance
|
|
7
|
+
* (and any other OTel chart consumer). Owned via `singleton(...)` for the
|
|
8
|
+
* same ApplySet-ownership reason documented on
|
|
9
|
+
* `clickstackHelmRepositoryBootstrap`.
|
|
10
|
+
*/
|
|
11
|
+
export declare const otelHelmRepositoryBootstrap: import("../../../index.js").CallableComposition<{
|
|
12
|
+
name: string;
|
|
13
|
+
namespace: string;
|
|
14
|
+
url: string;
|
|
15
|
+
}, {
|
|
16
|
+
ready: boolean;
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=otel-helm-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel-helm-repository.d.ts","sourceRoot":"","sources":["../../../../src/factories/clickstack/compositions/otel-helm-repository.ts"],"names":[],"mappings":"AAQA;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B;;;;;;EAsBvC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { kubernetesComposition } from '../../../core/composition/imperative.js';
|
|
2
|
+
import { Cel } from '../../../core/references/cel.js';
|
|
3
|
+
import { otelHelmRepository } from '../resources/helm.js';
|
|
4
|
+
import { OtelHelmRepositorySingletonSpecSchema, OtelHelmRepositorySingletonStatusSchema, } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Shared OpenTelemetry HelmRepository singleton.
|
|
7
|
+
*
|
|
8
|
+
* The official OpenTelemetry chart repository
|
|
9
|
+
* (https://open-telemetry.github.io/opentelemetry-helm-charts) is a single
|
|
10
|
+
* cluster-level Flux source shared by every `clickstackK8sTelemetry` instance
|
|
11
|
+
* (and any other OTel chart consumer). Owned via `singleton(...)` for the
|
|
12
|
+
* same ApplySet-ownership reason documented on
|
|
13
|
+
* `clickstackHelmRepositoryBootstrap`.
|
|
14
|
+
*/
|
|
15
|
+
export const otelHelmRepositoryBootstrap = kubernetesComposition({
|
|
16
|
+
name: 'opentelemetry-helm-repository',
|
|
17
|
+
kind: 'OpenTelemetryHelmRepository',
|
|
18
|
+
spec: OtelHelmRepositorySingletonSpecSchema,
|
|
19
|
+
status: OtelHelmRepositorySingletonStatusSchema,
|
|
20
|
+
}, (spec) => {
|
|
21
|
+
const repository = otelHelmRepository({
|
|
22
|
+
name: spec.name,
|
|
23
|
+
namespace: spec.namespace,
|
|
24
|
+
url: spec.url,
|
|
25
|
+
id: 'repository',
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
ready: Cel.expr(repository.status.conditions, '.exists(c, c.type == "Ready" && c.status == "True")'),
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=otel-helm-repository.js.map
|