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.
Files changed (70) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/core/deployment/kro-factory.d.ts +19 -0
  3. package/dist/core/deployment/kro-factory.d.ts.map +1 -1
  4. package/dist/core/deployment/kro-factory.js +60 -6
  5. package/dist/core/deployment/kro-factory.js.map +1 -1
  6. package/dist/core/proxy/create-resource.d.ts.map +1 -1
  7. package/dist/core/proxy/create-resource.js +37 -0
  8. package/dist/core/proxy/create-resource.js.map +1 -1
  9. package/dist/core/references/schema-proxy.d.ts.map +1 -1
  10. package/dist/core/references/schema-proxy.js +21 -5
  11. package/dist/core/references/schema-proxy.js.map +1 -1
  12. package/dist/factories/clickhouse/compositions/clickhouse-cluster.d.ts.map +1 -1
  13. package/dist/factories/clickhouse/compositions/clickhouse-cluster.js +47 -28
  14. package/dist/factories/clickhouse/compositions/clickhouse-cluster.js.map +1 -1
  15. package/dist/factories/clickhouse/types.d.ts +31 -0
  16. package/dist/factories/clickhouse/types.d.ts.map +1 -1
  17. package/dist/factories/clickhouse/types.js.map +1 -1
  18. package/dist/factories/clickstack/compositions/clickstack-bootstrap.d.ts +248 -0
  19. package/dist/factories/clickstack/compositions/clickstack-bootstrap.d.ts.map +1 -0
  20. package/dist/factories/clickstack/compositions/clickstack-bootstrap.js +257 -0
  21. package/dist/factories/clickstack/compositions/clickstack-bootstrap.js.map +1 -0
  22. package/dist/factories/clickstack/compositions/clickstack-helm-repository.d.ts +23 -0
  23. package/dist/factories/clickstack/compositions/clickstack-helm-repository.d.ts.map +1 -0
  24. package/dist/factories/clickstack/compositions/clickstack-helm-repository.js +36 -0
  25. package/dist/factories/clickstack/compositions/clickstack-helm-repository.js.map +1 -0
  26. package/dist/factories/clickstack/compositions/index.d.ts +5 -0
  27. package/dist/factories/clickstack/compositions/index.d.ts.map +1 -0
  28. package/dist/factories/clickstack/compositions/index.js +5 -0
  29. package/dist/factories/clickstack/compositions/index.js.map +1 -0
  30. package/dist/factories/clickstack/compositions/k8s-telemetry.d.ts +83 -0
  31. package/dist/factories/clickstack/compositions/k8s-telemetry.d.ts.map +1 -0
  32. package/dist/factories/clickstack/compositions/k8s-telemetry.js +134 -0
  33. package/dist/factories/clickstack/compositions/k8s-telemetry.js.map +1 -0
  34. package/dist/factories/clickstack/compositions/otel-helm-repository.d.ts +18 -0
  35. package/dist/factories/clickstack/compositions/otel-helm-repository.d.ts.map +1 -0
  36. package/dist/factories/clickstack/compositions/otel-helm-repository.js +31 -0
  37. package/dist/factories/clickstack/compositions/otel-helm-repository.js.map +1 -0
  38. package/dist/factories/clickstack/index.d.ts +40 -0
  39. package/dist/factories/clickstack/index.d.ts.map +1 -0
  40. package/dist/factories/clickstack/index.js +40 -0
  41. package/dist/factories/clickstack/index.js.map +1 -0
  42. package/dist/factories/clickstack/resources/helm.d.ts +78 -0
  43. package/dist/factories/clickstack/resources/helm.d.ts.map +1 -0
  44. package/dist/factories/clickstack/resources/helm.js +139 -0
  45. package/dist/factories/clickstack/resources/helm.js.map +1 -0
  46. package/dist/factories/clickstack/resources/index.d.ts +3 -0
  47. package/dist/factories/clickstack/resources/index.d.ts.map +1 -0
  48. package/dist/factories/clickstack/resources/index.js +3 -0
  49. package/dist/factories/clickstack/resources/index.js.map +1 -0
  50. package/dist/factories/clickstack/resources/mongo.d.ts +40 -0
  51. package/dist/factories/clickstack/resources/mongo.d.ts.map +1 -0
  52. package/dist/factories/clickstack/resources/mongo.js +122 -0
  53. package/dist/factories/clickstack/resources/mongo.js.map +1 -0
  54. package/dist/factories/clickstack/types.d.ts +485 -0
  55. package/dist/factories/clickstack/types.d.ts.map +1 -0
  56. package/dist/factories/clickstack/types.js +302 -0
  57. package/dist/factories/clickstack/types.js.map +1 -0
  58. package/dist/factories/clickstack/utils/helm-values-mapper.d.ts +118 -0
  59. package/dist/factories/clickstack/utils/helm-values-mapper.d.ts.map +1 -0
  60. package/dist/factories/clickstack/utils/helm-values-mapper.js +505 -0
  61. package/dist/factories/clickstack/utils/helm-values-mapper.js.map +1 -0
  62. package/dist/factories/clickstack/utils/index.d.ts +2 -0
  63. package/dist/factories/clickstack/utils/index.d.ts.map +1 -0
  64. package/dist/factories/clickstack/utils/index.js +2 -0
  65. package/dist/factories/clickstack/utils/index.js.map +1 -0
  66. package/dist/factories/index.d.ts +1 -0
  67. package/dist/factories/index.d.ts.map +1 -1
  68. package/dist/factories/index.js +4 -0
  69. package/dist/factories/index.js.map +1 -1
  70. 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,5 @@
1
+ export * from './clickstack-bootstrap.js';
2
+ export * from './clickstack-helm-repository.js';
3
+ export * from './k8s-telemetry.js';
4
+ export * from './otel-helm-repository.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,5 @@
1
+ export * from './clickstack-bootstrap.js';
2
+ export * from './clickstack-helm-repository.js';
3
+ export * from './k8s-telemetry.js';
4
+ export * from './otel-helm-repository.js';
5
+ //# sourceMappingURL=index.js.map
@@ -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