@bluedynamics/cdk8s-monitoring 0.0.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 (47) hide show
  1. package/CLAUDE.md +76 -0
  2. package/LICENSE +202 -0
  3. package/README.md +87 -0
  4. package/examples/synth.ts +17 -0
  5. package/lib/constructs/alloy.d.ts +29 -0
  6. package/lib/constructs/alloy.js +214 -0
  7. package/lib/constructs/grafana-password-secret.d.ts +57 -0
  8. package/lib/constructs/grafana-password-secret.js +99 -0
  9. package/lib/constructs/loki-s3-bucket.d.ts +24 -0
  10. package/lib/constructs/loki-s3-bucket.js +147 -0
  11. package/lib/constructs/loki-s3-credentials.d.ts +27 -0
  12. package/lib/constructs/loki-s3-credentials.js +71 -0
  13. package/lib/constructs/loki.d.ts +30 -0
  14. package/lib/constructs/loki.js +185 -0
  15. package/lib/constructs/namespace.d.ts +13 -0
  16. package/lib/constructs/namespace.js +34 -0
  17. package/lib/constructs/priority-class.d.ts +12 -0
  18. package/lib/constructs/priority-class.js +38 -0
  19. package/lib/constructs/prometheus-stack.d.ts +30 -0
  20. package/lib/constructs/prometheus-stack.js +477 -0
  21. package/lib/constructs/thanos-compactor.d.ts +35 -0
  22. package/lib/constructs/thanos-compactor.js +198 -0
  23. package/lib/constructs/thanos-query.d.ts +30 -0
  24. package/lib/constructs/thanos-query.js +205 -0
  25. package/lib/constructs/thanos-s3-bucket.d.ts +24 -0
  26. package/lib/constructs/thanos-s3-bucket.js +147 -0
  27. package/lib/constructs/thanos-s3-credentials.d.ts +27 -0
  28. package/lib/constructs/thanos-s3-credentials.js +93 -0
  29. package/lib/constructs/thanos-store.d.ts +30 -0
  30. package/lib/constructs/thanos-store.js +239 -0
  31. package/lib/default-config.d.ts +12 -0
  32. package/lib/default-config.js +77 -0
  33. package/lib/imports/external-secrets.io.d.ts +39243 -0
  34. package/lib/imports/external-secrets.io.js +23112 -0
  35. package/lib/imports/generators.external-secrets.io.d.ts +7831 -0
  36. package/lib/imports/generators.external-secrets.io.js +4895 -0
  37. package/lib/imports/k8s.d.ts +24537 -0
  38. package/lib/imports/k8s.js +18268 -0
  39. package/lib/imports/s3.aws.upbound.io.d.ts +2882 -0
  40. package/lib/imports/s3.aws.upbound.io.js +1828 -0
  41. package/lib/index.d.ts +17 -0
  42. package/lib/index.js +38 -0
  43. package/lib/monitoring-chart.d.ts +39 -0
  44. package/lib/monitoring-chart.js +127 -0
  45. package/lib/types.d.ts +142 -0
  46. package/lib/types.js +3 -0
  47. package/package.json +117 -0
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LokiConstruct = void 0;
4
+ const cdk8s_1 = require("cdk8s");
5
+ const constructs_1 = require("constructs");
6
+ /**
7
+ * Creates Loki HelmChart for log aggregation.
8
+ *
9
+ * This construct deploys Loki in SimpleScalable mode with:
10
+ * - Backend (2 replicas) - Index and compaction
11
+ * - Read (2 replicas) - Query processing
12
+ * - Write (2 replicas) - Log ingestion
13
+ * - Gateway (1 replica) - HTTP API endpoint
14
+ * - S3 storage backend (Hetzner Object Storage)
15
+ *
16
+ * Prerequisites:
17
+ * - Namespace exists
18
+ * - PriorityClass 'high-priority' exists
19
+ * - Longhorn storage class available
20
+ * - S3 bucket exists (via Crossplane)
21
+ * - S3 credentials secret exists (via LokiS3CredentialsConstruct)
22
+ *
23
+ * Sync Wave: 2 (core services - after S3 credentials secret)
24
+ */
25
+ class LokiConstruct extends constructs_1.Construct {
26
+ constructor(scope, id, props) {
27
+ super(scope, id);
28
+ const { namespace, config, s3CredentialsSecretName } = props;
29
+ // Generate Helm values YAML
30
+ const helmValues = this.generateHelmValues(config, s3CredentialsSecretName);
31
+ // Create HelmChart resource (K3S Helm controller)
32
+ // Wave 2: Core Services - log aggregation
33
+ new cdk8s_1.ApiObject(this, 'loki', {
34
+ apiVersion: 'helm.cattle.io/v1',
35
+ kind: 'HelmChart',
36
+ metadata: {
37
+ name: 'loki',
38
+ namespace: namespace,
39
+ labels: {
40
+ 'app.kubernetes.io/name': 'loki',
41
+ 'app.kubernetes.io/component': 'logging',
42
+ 'app.kubernetes.io/managed-by': 'cdk8s',
43
+ 'app.kubernetes.io/part-of': 'monitoring',
44
+ },
45
+ annotations: {
46
+ 'argocd.argoproj.io/sync-wave': '2',
47
+ },
48
+ },
49
+ spec: {
50
+ repo: 'https://grafana.github.io/helm-charts',
51
+ chart: 'loki',
52
+ version: config.versions.loki === 'latest' ? undefined : config.versions.loki,
53
+ targetNamespace: namespace,
54
+ valuesContent: helmValues,
55
+ },
56
+ });
57
+ }
58
+ generateHelmValues(config, s3CredentialsSecretName) {
59
+ // S3 credentials are injected via environment variables from a Kubernetes secret
60
+ // The secret is created by LokiS3CredentialsConstruct using ExternalSecrets
61
+ // Loki expands environment variables in config when -config.expand-env=true is set
62
+ return `deploymentMode: SimpleScalable
63
+
64
+ loki:
65
+ auth_enabled: false
66
+
67
+ schemaConfig:
68
+ configs:
69
+ - from: 2024-01-01
70
+ store: tsdb
71
+ object_store: s3
72
+ schema: v13
73
+ index:
74
+ prefix: loki_index_
75
+ period: 24h
76
+
77
+ storage:
78
+ bucketNames:
79
+ chunks: ${config.s3.buckets.loki}
80
+ ruler: ${config.s3.buckets.loki}
81
+ type: s3
82
+ s3:
83
+ endpoint: ${config.s3.endpoint}
84
+ region: auto # Dummy region for Hetzner S3 (endpoint determines actual location)
85
+ # Credentials are expanded from environment variables at runtime
86
+ secretAccessKey: \${AWS_SECRET_ACCESS_KEY}
87
+ accessKeyId: \${AWS_ACCESS_KEY_ID}
88
+ s3ForcePathStyle: false
89
+ insecure: false
90
+
91
+ limits_config:
92
+ allow_structured_metadata: true
93
+ max_streams_per_user: 100000
94
+ ingestion_rate_mb: 10
95
+ ingestion_burst_size_mb: 20
96
+ retention_period: ${config.retention.loki}
97
+ reject_old_samples: true
98
+ reject_old_samples_max_age: 168h
99
+
100
+ compactor:
101
+ retention_enabled: true
102
+ delete_request_store: s3
103
+
104
+ backend:
105
+ replicas: ${config.replicas.lokiBackend}
106
+ extraArgs:
107
+ - "-config.expand-env=true"
108
+ extraEnvFrom:
109
+ - secretRef:
110
+ name: ${s3CredentialsSecretName}
111
+ resources:
112
+ limits:
113
+ cpu: ${config.resources.lokiBackend.limits.cpu}
114
+ memory: ${config.resources.lokiBackend.limits.memory}
115
+ requests:
116
+ cpu: ${config.resources.lokiBackend.requests.cpu}
117
+ memory: ${config.resources.lokiBackend.requests.memory}
118
+ persistence:
119
+ enabled: true
120
+ storageClass: longhorn
121
+ size: ${config.storage.lokiBackend}
122
+ priorityClassName: high-priority
123
+
124
+ read:
125
+ replicas: ${config.replicas.lokiRead}
126
+ extraArgs:
127
+ - "-config.expand-env=true"
128
+ extraEnvFrom:
129
+ - secretRef:
130
+ name: ${s3CredentialsSecretName}
131
+ resources:
132
+ limits:
133
+ cpu: ${config.resources.lokiRead.limits.cpu}
134
+ memory: ${config.resources.lokiRead.limits.memory}
135
+ requests:
136
+ cpu: ${config.resources.lokiRead.requests.cpu}
137
+ memory: ${config.resources.lokiRead.requests.memory}
138
+ priorityClassName: high-priority
139
+
140
+ write:
141
+ replicas: ${config.replicas.lokiWrite}
142
+ extraArgs:
143
+ - "-config.expand-env=true"
144
+ extraEnvFrom:
145
+ - secretRef:
146
+ name: ${s3CredentialsSecretName}
147
+ resources:
148
+ limits:
149
+ cpu: ${config.resources.lokiWrite.limits.cpu}
150
+ memory: ${config.resources.lokiWrite.limits.memory}
151
+ requests:
152
+ cpu: ${config.resources.lokiWrite.requests.cpu}
153
+ memory: ${config.resources.lokiWrite.requests.memory}
154
+ persistence:
155
+ enabled: true
156
+ storageClass: longhorn
157
+ size: ${config.storage.lokiWrite}
158
+ priorityClassName: high-priority
159
+
160
+ gateway:
161
+ enabled: true
162
+ replicas: ${config.replicas.grafana}
163
+ resources:
164
+ limits:
165
+ cpu: ${config.resources.lokiGateway.limits.cpu}
166
+ memory: ${config.resources.lokiGateway.limits.memory}
167
+ requests:
168
+ cpu: ${config.resources.lokiGateway.requests.cpu}
169
+ memory: ${config.resources.lokiGateway.requests.memory}
170
+ priorityClassName: high-priority
171
+
172
+ minio:
173
+ enabled: false
174
+
175
+ # Disable memcached caches to reduce memory footprint
176
+ # Memcached is an optimization for high query loads, not required for small clusters
177
+ chunksCache:
178
+ enabled: false
179
+ resultsCache:
180
+ enabled: false
181
+ `;
182
+ }
183
+ }
184
+ exports.LokiConstruct = LokiConstruct;
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9raS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzL2xva2kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQWtDO0FBQ2xDLDJDQUF1QztBQVN2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBYSxhQUFjLFNBQVEsc0JBQVM7SUFDMUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQjtRQUN4RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLEdBQUcsS0FBSyxDQUFDO1FBRTdELDRCQUE0QjtRQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFNUUsa0RBQWtEO1FBQ2xELDBDQUEwQztRQUMxQyxJQUFJLGlCQUFTLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUMxQixVQUFVLEVBQUUsbUJBQW1CO1lBQy9CLElBQUksRUFBRSxXQUFXO1lBQ2pCLFFBQVEsRUFBRTtnQkFDUixJQUFJLEVBQUUsTUFBTTtnQkFDWixTQUFTLEVBQUUsU0FBUztnQkFDcEIsTUFBTSxFQUFFO29CQUNOLHdCQUF3QixFQUFFLE1BQU07b0JBQ2hDLDZCQUE2QixFQUFFLFNBQVM7b0JBQ3hDLDhCQUE4QixFQUFFLE9BQU87b0JBQ3ZDLDJCQUEyQixFQUFFLFlBQVk7aUJBQzFDO2dCQUNELFdBQVcsRUFBRTtvQkFDWCw4QkFBOEIsRUFBRSxHQUFHO2lCQUNwQzthQUNGO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSx1Q0FBdUM7Z0JBQzdDLEtBQUssRUFBRSxNQUFNO2dCQUNiLE9BQU8sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJO2dCQUM3RSxlQUFlLEVBQUUsU0FBUztnQkFDMUIsYUFBYSxFQUFFLFVBQVU7YUFDMUI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sa0JBQWtCLENBQ3hCLE1BQXdCLEVBQ3hCLHVCQUErQjtRQUUvQixpRkFBaUY7UUFDakYsNEVBQTRFO1FBQzVFLG1GQUFtRjtRQUVuRixPQUFPOzs7Ozs7Ozs7Ozs7Ozs7OztnQkFpQkssTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSTtlQUN2QixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJOzs7a0JBR25CLE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUTs7Ozs7Ozs7Ozs7Ozt3QkFhWixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUk7Ozs7Ozs7OztjQVMvQixNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVc7Ozs7O2dCQUt6Qix1QkFBdUI7OzthQUcxQixNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRztnQkFDcEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU07O2FBRTdDLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHO2dCQUN0QyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTTs7OztZQUloRCxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7Ozs7Y0FJeEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFROzs7OztnQkFLdEIsdUJBQXVCOzs7YUFHMUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUc7Z0JBQ2pDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNOzthQUUxQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRztnQkFDbkMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU07Ozs7Y0FJM0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTOzs7OztnQkFLdkIsdUJBQXVCOzs7YUFHMUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUc7Z0JBQ2xDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNOzthQUUzQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRztnQkFDcEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU07Ozs7WUFJOUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTOzs7OztjQUt0QixNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU87OzthQUd4QixNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRztnQkFDcEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU07O2FBRTdDLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHO2dCQUN0QyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTTs7Ozs7Ozs7Ozs7O0NBWTNELENBQUM7SUFDQSxDQUFDO0NBQ0Y7QUF0S0Qsc0NBc0tDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBpT2JqZWN0IH0gZnJvbSAnY2RrOHMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNb25pdG9yaW5nQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExva2lQcm9wcyB7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xuICBjb25maWc6IE1vbml0b3JpbmdDb25maWc7XG4gIHMzQ3JlZGVudGlhbHNTZWNyZXROYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBMb2tpIEhlbG1DaGFydCBmb3IgbG9nIGFnZ3JlZ2F0aW9uLlxuICpcbiAqIFRoaXMgY29uc3RydWN0IGRlcGxveXMgTG9raSBpbiBTaW1wbGVTY2FsYWJsZSBtb2RlIHdpdGg6XG4gKiAtIEJhY2tlbmQgKDIgcmVwbGljYXMpIC0gSW5kZXggYW5kIGNvbXBhY3Rpb25cbiAqIC0gUmVhZCAoMiByZXBsaWNhcykgLSBRdWVyeSBwcm9jZXNzaW5nXG4gKiAtIFdyaXRlICgyIHJlcGxpY2FzKSAtIExvZyBpbmdlc3Rpb25cbiAqIC0gR2F0ZXdheSAoMSByZXBsaWNhKSAtIEhUVFAgQVBJIGVuZHBvaW50XG4gKiAtIFMzIHN0b3JhZ2UgYmFja2VuZCAoSGV0em5lciBPYmplY3QgU3RvcmFnZSlcbiAqXG4gKiBQcmVyZXF1aXNpdGVzOlxuICogLSBOYW1lc3BhY2UgZXhpc3RzXG4gKiAtIFByaW9yaXR5Q2xhc3MgJ2hpZ2gtcHJpb3JpdHknIGV4aXN0c1xuICogLSBMb25naG9ybiBzdG9yYWdlIGNsYXNzIGF2YWlsYWJsZVxuICogLSBTMyBidWNrZXQgZXhpc3RzICh2aWEgQ3Jvc3NwbGFuZSlcbiAqIC0gUzMgY3JlZGVudGlhbHMgc2VjcmV0IGV4aXN0cyAodmlhIExva2lTM0NyZWRlbnRpYWxzQ29uc3RydWN0KVxuICpcbiAqIFN5bmMgV2F2ZTogMiAoY29yZSBzZXJ2aWNlcyAtIGFmdGVyIFMzIGNyZWRlbnRpYWxzIHNlY3JldClcbiAqL1xuZXhwb3J0IGNsYXNzIExva2lDb25zdHJ1Y3QgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTG9raVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHsgbmFtZXNwYWNlLCBjb25maWcsIHMzQ3JlZGVudGlhbHNTZWNyZXROYW1lIH0gPSBwcm9wcztcblxuICAgIC8vIEdlbmVyYXRlIEhlbG0gdmFsdWVzIFlBTUxcbiAgICBjb25zdCBoZWxtVmFsdWVzID0gdGhpcy5nZW5lcmF0ZUhlbG1WYWx1ZXMoY29uZmlnLCBzM0NyZWRlbnRpYWxzU2VjcmV0TmFtZSk7XG5cbiAgICAvLyBDcmVhdGUgSGVsbUNoYXJ0IHJlc291cmNlIChLM1MgSGVsbSBjb250cm9sbGVyKVxuICAgIC8vIFdhdmUgMjogQ29yZSBTZXJ2aWNlcyAtIGxvZyBhZ2dyZWdhdGlvblxuICAgIG5ldyBBcGlPYmplY3QodGhpcywgJ2xva2knLCB7XG4gICAgICBhcGlWZXJzaW9uOiAnaGVsbS5jYXR0bGUuaW8vdjEnLFxuICAgICAga2luZDogJ0hlbG1DaGFydCcsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBuYW1lOiAnbG9raScsXG4gICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSc6ICdsb2tpJyxcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50JzogJ2xvZ2dpbmcnLFxuICAgICAgICAgICdhcHAua3ViZXJuZXRlcy5pby9tYW5hZ2VkLWJ5JzogJ2NkazhzJyxcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vcGFydC1vZic6ICdtb25pdG9yaW5nJyxcbiAgICAgICAgfSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAnYXJnb2NkLmFyZ29wcm9qLmlvL3N5bmMtd2F2ZSc6ICcyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzcGVjOiB7XG4gICAgICAgIHJlcG86ICdodHRwczovL2dyYWZhbmEuZ2l0aHViLmlvL2hlbG0tY2hhcnRzJyxcbiAgICAgICAgY2hhcnQ6ICdsb2tpJyxcbiAgICAgICAgdmVyc2lvbjogY29uZmlnLnZlcnNpb25zLmxva2kgPT09ICdsYXRlc3QnID8gdW5kZWZpbmVkIDogY29uZmlnLnZlcnNpb25zLmxva2ksXG4gICAgICAgIHRhcmdldE5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgICB2YWx1ZXNDb250ZW50OiBoZWxtVmFsdWVzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVIZWxtVmFsdWVzKFxuICAgIGNvbmZpZzogTW9uaXRvcmluZ0NvbmZpZyxcbiAgICBzM0NyZWRlbnRpYWxzU2VjcmV0TmFtZTogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIC8vIFMzIGNyZWRlbnRpYWxzIGFyZSBpbmplY3RlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYSBLdWJlcm5ldGVzIHNlY3JldFxuICAgIC8vIFRoZSBzZWNyZXQgaXMgY3JlYXRlZCBieSBMb2tpUzNDcmVkZW50aWFsc0NvbnN0cnVjdCB1c2luZyBFeHRlcm5hbFNlY3JldHNcbiAgICAvLyBMb2tpIGV4cGFuZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIGNvbmZpZyB3aGVuIC1jb25maWcuZXhwYW5kLWVudj10cnVlIGlzIHNldFxuXG4gICAgcmV0dXJuIGBkZXBsb3ltZW50TW9kZTogU2ltcGxlU2NhbGFibGVcblxubG9raTpcbiAgYXV0aF9lbmFibGVkOiBmYWxzZVxuXG4gIHNjaGVtYUNvbmZpZzpcbiAgICBjb25maWdzOlxuICAgICAgLSBmcm9tOiAyMDI0LTAxLTAxXG4gICAgICAgIHN0b3JlOiB0c2RiXG4gICAgICAgIG9iamVjdF9zdG9yZTogczNcbiAgICAgICAgc2NoZW1hOiB2MTNcbiAgICAgICAgaW5kZXg6XG4gICAgICAgICAgcHJlZml4OiBsb2tpX2luZGV4X1xuICAgICAgICAgIHBlcmlvZDogMjRoXG5cbiAgc3RvcmFnZTpcbiAgICBidWNrZXROYW1lczpcbiAgICAgIGNodW5rczogJHtjb25maWcuczMuYnVja2V0cy5sb2tpfVxuICAgICAgcnVsZXI6ICR7Y29uZmlnLnMzLmJ1Y2tldHMubG9raX1cbiAgICB0eXBlOiBzM1xuICAgIHMzOlxuICAgICAgZW5kcG9pbnQ6ICR7Y29uZmlnLnMzLmVuZHBvaW50fVxuICAgICAgcmVnaW9uOiBhdXRvICAjIER1bW15IHJlZ2lvbiBmb3IgSGV0em5lciBTMyAoZW5kcG9pbnQgZGV0ZXJtaW5lcyBhY3R1YWwgbG9jYXRpb24pXG4gICAgICAjIENyZWRlbnRpYWxzIGFyZSBleHBhbmRlZCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcyBhdCBydW50aW1lXG4gICAgICBzZWNyZXRBY2Nlc3NLZXk6IFxcJHtBV1NfU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICBhY2Nlc3NLZXlJZDogXFwke0FXU19BQ0NFU1NfS0VZX0lEfVxuICAgICAgczNGb3JjZVBhdGhTdHlsZTogZmFsc2VcbiAgICAgIGluc2VjdXJlOiBmYWxzZVxuXG4gIGxpbWl0c19jb25maWc6XG4gICAgYWxsb3dfc3RydWN0dXJlZF9tZXRhZGF0YTogdHJ1ZVxuICAgIG1heF9zdHJlYW1zX3Blcl91c2VyOiAxMDAwMDBcbiAgICBpbmdlc3Rpb25fcmF0ZV9tYjogMTBcbiAgICBpbmdlc3Rpb25fYnVyc3Rfc2l6ZV9tYjogMjBcbiAgICByZXRlbnRpb25fcGVyaW9kOiAke2NvbmZpZy5yZXRlbnRpb24ubG9raX1cbiAgICByZWplY3Rfb2xkX3NhbXBsZXM6IHRydWVcbiAgICByZWplY3Rfb2xkX3NhbXBsZXNfbWF4X2FnZTogMTY4aFxuXG4gIGNvbXBhY3RvcjpcbiAgICByZXRlbnRpb25fZW5hYmxlZDogdHJ1ZVxuICAgIGRlbGV0ZV9yZXF1ZXN0X3N0b3JlOiBzM1xuXG5iYWNrZW5kOlxuICByZXBsaWNhczogJHtjb25maWcucmVwbGljYXMubG9raUJhY2tlbmR9XG4gIGV4dHJhQXJnczpcbiAgICAtIFwiLWNvbmZpZy5leHBhbmQtZW52PXRydWVcIlxuICBleHRyYUVudkZyb206XG4gICAgLSBzZWNyZXRSZWY6XG4gICAgICAgIG5hbWU6ICR7czNDcmVkZW50aWFsc1NlY3JldE5hbWV9XG4gIHJlc291cmNlczpcbiAgICBsaW1pdHM6XG4gICAgICBjcHU6ICR7Y29uZmlnLnJlc291cmNlcy5sb2tpQmFja2VuZC5saW1pdHMuY3B1fVxuICAgICAgbWVtb3J5OiAke2NvbmZpZy5yZXNvdXJjZXMubG9raUJhY2tlbmQubGltaXRzLm1lbW9yeX1cbiAgICByZXF1ZXN0czpcbiAgICAgIGNwdTogJHtjb25maWcucmVzb3VyY2VzLmxva2lCYWNrZW5kLnJlcXVlc3RzLmNwdX1cbiAgICAgIG1lbW9yeTogJHtjb25maWcucmVzb3VyY2VzLmxva2lCYWNrZW5kLnJlcXVlc3RzLm1lbW9yeX1cbiAgcGVyc2lzdGVuY2U6XG4gICAgZW5hYmxlZDogdHJ1ZVxuICAgIHN0b3JhZ2VDbGFzczogbG9uZ2hvcm5cbiAgICBzaXplOiAke2NvbmZpZy5zdG9yYWdlLmxva2lCYWNrZW5kfVxuICBwcmlvcml0eUNsYXNzTmFtZTogaGlnaC1wcmlvcml0eVxuXG5yZWFkOlxuICByZXBsaWNhczogJHtjb25maWcucmVwbGljYXMubG9raVJlYWR9XG4gIGV4dHJhQXJnczpcbiAgICAtIFwiLWNvbmZpZy5leHBhbmQtZW52PXRydWVcIlxuICBleHRyYUVudkZyb206XG4gICAgLSBzZWNyZXRSZWY6XG4gICAgICAgIG5hbWU6ICR7czNDcmVkZW50aWFsc1NlY3JldE5hbWV9XG4gIHJlc291cmNlczpcbiAgICBsaW1pdHM6XG4gICAgICBjcHU6ICR7Y29uZmlnLnJlc291cmNlcy5sb2tpUmVhZC5saW1pdHMuY3B1fVxuICAgICAgbWVtb3J5OiAke2NvbmZpZy5yZXNvdXJjZXMubG9raVJlYWQubGltaXRzLm1lbW9yeX1cbiAgICByZXF1ZXN0czpcbiAgICAgIGNwdTogJHtjb25maWcucmVzb3VyY2VzLmxva2lSZWFkLnJlcXVlc3RzLmNwdX1cbiAgICAgIG1lbW9yeTogJHtjb25maWcucmVzb3VyY2VzLmxva2lSZWFkLnJlcXVlc3RzLm1lbW9yeX1cbiAgcHJpb3JpdHlDbGFzc05hbWU6IGhpZ2gtcHJpb3JpdHlcblxud3JpdGU6XG4gIHJlcGxpY2FzOiAke2NvbmZpZy5yZXBsaWNhcy5sb2tpV3JpdGV9XG4gIGV4dHJhQXJnczpcbiAgICAtIFwiLWNvbmZpZy5leHBhbmQtZW52PXRydWVcIlxuICBleHRyYUVudkZyb206XG4gICAgLSBzZWNyZXRSZWY6XG4gICAgICAgIG5hbWU6ICR7czNDcmVkZW50aWFsc1NlY3JldE5hbWV9XG4gIHJlc291cmNlczpcbiAgICBsaW1pdHM6XG4gICAgICBjcHU6ICR7Y29uZmlnLnJlc291cmNlcy5sb2tpV3JpdGUubGltaXRzLmNwdX1cbiAgICAgIG1lbW9yeTogJHtjb25maWcucmVzb3VyY2VzLmxva2lXcml0ZS5saW1pdHMubWVtb3J5fVxuICAgIHJlcXVlc3RzOlxuICAgICAgY3B1OiAke2NvbmZpZy5yZXNvdXJjZXMubG9raVdyaXRlLnJlcXVlc3RzLmNwdX1cbiAgICAgIG1lbW9yeTogJHtjb25maWcucmVzb3VyY2VzLmxva2lXcml0ZS5yZXF1ZXN0cy5tZW1vcnl9XG4gIHBlcnNpc3RlbmNlOlxuICAgIGVuYWJsZWQ6IHRydWVcbiAgICBzdG9yYWdlQ2xhc3M6IGxvbmdob3JuXG4gICAgc2l6ZTogJHtjb25maWcuc3RvcmFnZS5sb2tpV3JpdGV9XG4gIHByaW9yaXR5Q2xhc3NOYW1lOiBoaWdoLXByaW9yaXR5XG5cbmdhdGV3YXk6XG4gIGVuYWJsZWQ6IHRydWVcbiAgcmVwbGljYXM6ICR7Y29uZmlnLnJlcGxpY2FzLmdyYWZhbmF9XG4gIHJlc291cmNlczpcbiAgICBsaW1pdHM6XG4gICAgICBjcHU6ICR7Y29uZmlnLnJlc291cmNlcy5sb2tpR2F0ZXdheS5saW1pdHMuY3B1fVxuICAgICAgbWVtb3J5OiAke2NvbmZpZy5yZXNvdXJjZXMubG9raUdhdGV3YXkubGltaXRzLm1lbW9yeX1cbiAgICByZXF1ZXN0czpcbiAgICAgIGNwdTogJHtjb25maWcucmVzb3VyY2VzLmxva2lHYXRld2F5LnJlcXVlc3RzLmNwdX1cbiAgICAgIG1lbW9yeTogJHtjb25maWcucmVzb3VyY2VzLmxva2lHYXRld2F5LnJlcXVlc3RzLm1lbW9yeX1cbiAgcHJpb3JpdHlDbGFzc05hbWU6IGhpZ2gtcHJpb3JpdHlcblxubWluaW86XG4gIGVuYWJsZWQ6IGZhbHNlXG5cbiMgRGlzYWJsZSBtZW1jYWNoZWQgY2FjaGVzIHRvIHJlZHVjZSBtZW1vcnkgZm9vdHByaW50XG4jIE1lbWNhY2hlZCBpcyBhbiBvcHRpbWl6YXRpb24gZm9yIGhpZ2ggcXVlcnkgbG9hZHMsIG5vdCByZXF1aXJlZCBmb3Igc21hbGwgY2x1c3RlcnNcbmNodW5rc0NhY2hlOlxuICBlbmFibGVkOiBmYWxzZVxucmVzdWx0c0NhY2hlOlxuICBlbmFibGVkOiBmYWxzZVxuYDtcbiAgfVxufVxuIl19
@@ -0,0 +1,13 @@
1
+ import { Construct } from 'constructs';
2
+ export interface NamespaceProps {
3
+ name: string;
4
+ }
5
+ /**
6
+ * Creates the monitoring namespace with proper labels and ArgoCD sync-wave annotation.
7
+ *
8
+ * Sync Wave: 0 (foundation - must exist before any other resources)
9
+ */
10
+ export declare class NamespaceConstruct extends Construct {
11
+ readonly name: string;
12
+ constructor(scope: Construct, id: string, props: NamespaceProps);
13
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NamespaceConstruct = void 0;
4
+ const constructs_1 = require("constructs");
5
+ const k8s_1 = require("../imports/k8s");
6
+ /**
7
+ * Creates the monitoring namespace with proper labels and ArgoCD sync-wave annotation.
8
+ *
9
+ * Sync Wave: 0 (foundation - must exist before any other resources)
10
+ */
11
+ class NamespaceConstruct extends constructs_1.Construct {
12
+ constructor(scope, id, props) {
13
+ super(scope, id);
14
+ this.name = props.name;
15
+ // Create namespace
16
+ // Wave 0: Foundation - must exist before any other resources
17
+ new k8s_1.KubeNamespace(this, 'namespace', {
18
+ metadata: {
19
+ name: props.name,
20
+ annotations: {
21
+ 'argocd.argoproj.io/sync-wave': '0',
22
+ },
23
+ labels: {
24
+ 'name': props.name,
25
+ 'app.kubernetes.io/name': 'monitoring',
26
+ 'app.kubernetes.io/component': 'observability',
27
+ 'app.kubernetes.io/managed-by': 'cdk8s',
28
+ },
29
+ },
30
+ });
31
+ }
32
+ }
33
+ exports.NamespaceConstruct = NamespaceConstruct;
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZXNwYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvbmFtZXNwYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2Qyx3Q0FBK0M7QUFNL0M7Ozs7R0FJRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsc0JBQVM7SUFHL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFxQjtRQUM3RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUV2QixtQkFBbUI7UUFDbkIsNkRBQTZEO1FBQzdELElBQUksbUJBQWEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFO1lBQ25DLFFBQVEsRUFBRTtnQkFDUixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ2hCLFdBQVcsRUFBRTtvQkFDWCw4QkFBOEIsRUFBRSxHQUFHO2lCQUNwQztnQkFDRCxNQUFNLEVBQUU7b0JBQ04sTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJO29CQUNsQix3QkFBd0IsRUFBRSxZQUFZO29CQUN0Qyw2QkFBNkIsRUFBRSxlQUFlO29CQUM5Qyw4QkFBOEIsRUFBRSxPQUFPO2lCQUN4QzthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBekJELGdEQXlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgS3ViZU5hbWVzcGFjZSB9IGZyb20gJy4uL2ltcG9ydHMvazhzJztcblxuZXhwb3J0IGludGVyZmFjZSBOYW1lc3BhY2VQcm9wcyB7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBtb25pdG9yaW5nIG5hbWVzcGFjZSB3aXRoIHByb3BlciBsYWJlbHMgYW5kIEFyZ29DRCBzeW5jLXdhdmUgYW5ub3RhdGlvbi5cbiAqXG4gKiBTeW5jIFdhdmU6IDAgKGZvdW5kYXRpb24gLSBtdXN0IGV4aXN0IGJlZm9yZSBhbnkgb3RoZXIgcmVzb3VyY2VzKVxuICovXG5leHBvcnQgY2xhc3MgTmFtZXNwYWNlQ29uc3RydWN0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmFtZXNwYWNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5uYW1lID0gcHJvcHMubmFtZTtcblxuICAgIC8vIENyZWF0ZSBuYW1lc3BhY2VcbiAgICAvLyBXYXZlIDA6IEZvdW5kYXRpb24gLSBtdXN0IGV4aXN0IGJlZm9yZSBhbnkgb3RoZXIgcmVzb3VyY2VzXG4gICAgbmV3IEt1YmVOYW1lc3BhY2UodGhpcywgJ25hbWVzcGFjZScsIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIG5hbWU6IHByb3BzLm5hbWUsXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgJ2FyZ29jZC5hcmdvcHJvai5pby9zeW5jLXdhdmUnOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICAgIGxhYmVsczoge1xuICAgICAgICAgICduYW1lJzogcHJvcHMubmFtZSxcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSc6ICdtb25pdG9yaW5nJyxcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50JzogJ29ic2VydmFiaWxpdHknLFxuICAgICAgICAgICdhcHAua3ViZXJuZXRlcy5pby9tYW5hZ2VkLWJ5JzogJ2NkazhzJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import { Construct } from 'constructs';
2
+ /**
3
+ * Creates a high-priority PriorityClass for monitoring components.
4
+ *
5
+ * PriorityClass ensures monitoring pods are scheduled with higher priority
6
+ * than regular workloads, preventing eviction during resource pressure.
7
+ *
8
+ * Sync Wave: 0 (foundation - must exist before pods reference it)
9
+ */
10
+ export declare class PriorityClassConstruct extends Construct {
11
+ constructor(scope: Construct, id: string);
12
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PriorityClassConstruct = void 0;
4
+ const constructs_1 = require("constructs");
5
+ const k8s_1 = require("../imports/k8s");
6
+ /**
7
+ * Creates a high-priority PriorityClass for monitoring components.
8
+ *
9
+ * PriorityClass ensures monitoring pods are scheduled with higher priority
10
+ * than regular workloads, preventing eviction during resource pressure.
11
+ *
12
+ * Sync Wave: 0 (foundation - must exist before pods reference it)
13
+ */
14
+ class PriorityClassConstruct extends constructs_1.Construct {
15
+ constructor(scope, id) {
16
+ super(scope, id);
17
+ // Create PriorityClass
18
+ // Wave 0: Foundation - must exist before pods can reference it
19
+ new k8s_1.KubePriorityClass(this, 'high-priority', {
20
+ metadata: {
21
+ name: 'high-priority',
22
+ labels: {
23
+ 'app.kubernetes.io/name': 'high-priority',
24
+ 'app.kubernetes.io/component': 'scheduling',
25
+ 'app.kubernetes.io/managed-by': 'cdk8s',
26
+ },
27
+ annotations: {
28
+ 'argocd.argoproj.io/sync-wave': '0',
29
+ },
30
+ },
31
+ value: 10000,
32
+ globalDefault: false,
33
+ description: 'Use this class for high-priority pods only.',
34
+ });
35
+ }
36
+ }
37
+ exports.PriorityClassConstruct = PriorityClassConstruct;
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpb3JpdHktY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RydWN0cy9wcmlvcml0eS1jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFDdkMsd0NBQW1EO0FBRW5EOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLHNCQUF1QixTQUFRLHNCQUFTO0lBQ25ELFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsdUJBQXVCO1FBQ3ZCLCtEQUErRDtRQUMvRCxJQUFJLHVCQUFpQixDQUFDLElBQUksRUFBRSxlQUFlLEVBQUU7WUFDM0MsUUFBUSxFQUFFO2dCQUNSLElBQUksRUFBRSxlQUFlO2dCQUNyQixNQUFNLEVBQUU7b0JBQ04sd0JBQXdCLEVBQUUsZUFBZTtvQkFDekMsNkJBQTZCLEVBQUUsWUFBWTtvQkFDM0MsOEJBQThCLEVBQUUsT0FBTztpQkFDeEM7Z0JBQ0QsV0FBVyxFQUFFO29CQUNYLDhCQUE4QixFQUFFLEdBQUc7aUJBQ3BDO2FBQ0Y7WUFDRCxLQUFLLEVBQUUsS0FBSztZQUNaLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLFdBQVcsRUFBRSw2Q0FBNkM7U0FDM0QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBdkJELHdEQXVCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgS3ViZVByaW9yaXR5Q2xhc3MgfSBmcm9tICcuLi9pbXBvcnRzL2s4cyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhpZ2gtcHJpb3JpdHkgUHJpb3JpdHlDbGFzcyBmb3IgbW9uaXRvcmluZyBjb21wb25lbnRzLlxuICpcbiAqIFByaW9yaXR5Q2xhc3MgZW5zdXJlcyBtb25pdG9yaW5nIHBvZHMgYXJlIHNjaGVkdWxlZCB3aXRoIGhpZ2hlciBwcmlvcml0eVxuICogdGhhbiByZWd1bGFyIHdvcmtsb2FkcywgcHJldmVudGluZyBldmljdGlvbiBkdXJpbmcgcmVzb3VyY2UgcHJlc3N1cmUuXG4gKlxuICogU3luYyBXYXZlOiAwIChmb3VuZGF0aW9uIC0gbXVzdCBleGlzdCBiZWZvcmUgcG9kcyByZWZlcmVuY2UgaXQpXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmlvcml0eUNsYXNzQ29uc3RydWN0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBDcmVhdGUgUHJpb3JpdHlDbGFzc1xuICAgIC8vIFdhdmUgMDogRm91bmRhdGlvbiAtIG11c3QgZXhpc3QgYmVmb3JlIHBvZHMgY2FuIHJlZmVyZW5jZSBpdFxuICAgIG5ldyBLdWJlUHJpb3JpdHlDbGFzcyh0aGlzLCAnaGlnaC1wcmlvcml0eScsIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIG5hbWU6ICdoaWdoLXByaW9yaXR5JyxcbiAgICAgICAgbGFiZWxzOiB7XG4gICAgICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL25hbWUnOiAnaGlnaC1wcmlvcml0eScsXG4gICAgICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL2NvbXBvbmVudCc6ICdzY2hlZHVsaW5nJyxcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSc6ICdjZGs4cycsXG4gICAgICAgIH0sXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgJ2FyZ29jZC5hcmdvcHJvai5pby9zeW5jLXdhdmUnOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdmFsdWU6IDEwMDAwLFxuICAgICAgZ2xvYmFsRGVmYXVsdDogZmFsc2UsXG4gICAgICBkZXNjcmlwdGlvbjogJ1VzZSB0aGlzIGNsYXNzIGZvciBoaWdoLXByaW9yaXR5IHBvZHMgb25seS4nLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,30 @@
1
+ import { Construct } from 'constructs';
2
+ import { MonitoringConfig } from '../types';
3
+ export interface PrometheusStackProps {
4
+ namespace: string;
5
+ config: MonitoringConfig;
6
+ }
7
+ /**
8
+ * Creates kube-prometheus-stack HelmChart with Prometheus, Grafana, and Alertmanager.
9
+ *
10
+ * This is the core monitoring stack that includes:
11
+ * - Prometheus (metrics collection, 2 replicas, 3d retention)
12
+ * - Grafana (visualization, ingress with Let's Encrypt)
13
+ * - Alertmanager (alert routing, SMTP notifications)
14
+ * - Prometheus Operator (manages Prometheus CRDs)
15
+ * - Node Exporter (system metrics DaemonSet)
16
+ * - kube-state-metrics (Kubernetes resource metrics)
17
+ *
18
+ * Prerequisites:
19
+ * - Namespace exists
20
+ * - PriorityClass 'high-priority' exists
21
+ * - Longhorn storage class available
22
+ * - cert-manager ClusterIssuer configured
23
+ * - Thanos S3 secret exists (thanos-objstore-config)
24
+ *
25
+ * Sync Wave: 2 (core services - after S3 buckets and secrets)
26
+ */
27
+ export declare class PrometheusStackConstruct extends Construct {
28
+ constructor(scope: Construct, id: string, props: PrometheusStackProps);
29
+ private generateHelmValues;
30
+ }