@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,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThanosS3BucketConstruct = void 0;
4
+ const cdk8s_1 = require("cdk8s");
5
+ const constructs_1 = require("constructs");
6
+ const s3_aws_upbound_io_1 = require("../imports/s3.aws.upbound.io");
7
+ /**
8
+ * Creates Crossplane Bucket resources for Thanos long-term metrics storage.
9
+ *
10
+ * This construct generates:
11
+ * - S3 Bucket (via Crossplane Upbound provider-aws-s3)
12
+ * - BucketVersioning (for recovery)
13
+ * - BucketLifecycleConfiguration (2-year retention)
14
+ *
15
+ * Prerequisites:
16
+ * - Crossplane operator installed
17
+ * - Upbound provider-aws-s3 installed
18
+ * - ProviderConfig 'hetzner-s3' configured (points to Hetzner S3)
19
+ * - Hetzner S3 credentials secret exists in crossplane-system
20
+ *
21
+ * Sync Wave: 1 (external dependencies - must exist before pods access S3)
22
+ */
23
+ class ThanosS3BucketConstruct extends constructs_1.Construct {
24
+ constructor(scope, id, props) {
25
+ super(scope, id);
26
+ const { config } = props;
27
+ const bucketName = config.s3.buckets.thanos;
28
+ const region = config.s3.region;
29
+ // Create Bucket
30
+ // Wave 1: External Dependencies - S3 bucket provisioned by Crossplane
31
+ // Note: Using ApiObject because cdk8s import limitations prevent importing Bucket type
32
+ new cdk8s_1.ApiObject(this, 'bucket', {
33
+ apiVersion: 's3.aws.upbound.io/v1beta2',
34
+ kind: 'Bucket',
35
+ metadata: {
36
+ name: bucketName,
37
+ namespace: 'crossplane-system',
38
+ labels: {
39
+ 'app.kubernetes.io/name': 'thanos',
40
+ 'app.kubernetes.io/component': 'storage',
41
+ 'app.kubernetes.io/managed-by': 'cdk8s',
42
+ 'app.kubernetes.io/part-of': 'monitoring',
43
+ },
44
+ annotations: {
45
+ 'argocd.argoproj.io/sync-wave': '1',
46
+ 'crossplane.io/external-name': bucketName,
47
+ 'description': 'Thanos long-term metrics storage (2-year retention)',
48
+ },
49
+ },
50
+ spec: {
51
+ deletionPolicy: 'Delete',
52
+ managementPolicies: [
53
+ 'Observe',
54
+ 'Create',
55
+ 'Delete',
56
+ // Skip Update to avoid tagging operations (not supported by Hetzner S3)
57
+ ],
58
+ forProvider: {
59
+ region: region, // Production region (endpoint determines actual location)
60
+ },
61
+ providerConfigRef: {
62
+ name: 'hetzner-s3',
63
+ },
64
+ },
65
+ });
66
+ // Create BucketVersioning
67
+ // Enable versioning for bucket recovery
68
+ // Note: Using ApiObject because cdk8s import limitations prevent importing BucketVersioning type
69
+ new cdk8s_1.ApiObject(this, 'versioning', {
70
+ apiVersion: 's3.aws.upbound.io/v1beta2',
71
+ kind: 'BucketVersioning',
72
+ metadata: {
73
+ name: 'thanos-metrics-versioning',
74
+ namespace: 'crossplane-system',
75
+ labels: {
76
+ 'app.kubernetes.io/name': 'thanos',
77
+ 'app.kubernetes.io/component': 'storage',
78
+ 'app.kubernetes.io/managed-by': 'cdk8s',
79
+ 'app.kubernetes.io/part-of': 'monitoring',
80
+ },
81
+ annotations: {
82
+ 'argocd.argoproj.io/sync-wave': '1',
83
+ },
84
+ },
85
+ spec: {
86
+ forProvider: {
87
+ region: region, // Production region (same as bucket)
88
+ bucketRef: {
89
+ name: bucketName,
90
+ },
91
+ versioningConfiguration: {
92
+ status: 'Enabled',
93
+ },
94
+ },
95
+ providerConfigRef: {
96
+ name: 'hetzner-s3',
97
+ },
98
+ },
99
+ });
100
+ // Create BucketLifecycleConfiguration
101
+ // Lifecycle policy: Delete downsampled blocks after 2 years (cost control)
102
+ new s3_aws_upbound_io_1.BucketLifecycleConfiguration(this, 'lifecycle', {
103
+ metadata: {
104
+ name: 'thanos-metrics-lifecycle',
105
+ namespace: 'crossplane-system',
106
+ labels: {
107
+ 'app.kubernetes.io/name': 'thanos',
108
+ 'app.kubernetes.io/component': 'storage',
109
+ 'app.kubernetes.io/managed-by': 'cdk8s',
110
+ 'app.kubernetes.io/part-of': 'monitoring',
111
+ },
112
+ annotations: {
113
+ 'argocd.argoproj.io/sync-wave': '1',
114
+ },
115
+ },
116
+ spec: {
117
+ managementPolicies: [
118
+ s3_aws_upbound_io_1.BucketLifecycleConfigurationSpecManagementPolicies.OBSERVE,
119
+ s3_aws_upbound_io_1.BucketLifecycleConfigurationSpecManagementPolicies.CREATE,
120
+ s3_aws_upbound_io_1.BucketLifecycleConfigurationSpecManagementPolicies.DELETE,
121
+ ],
122
+ forProvider: {
123
+ region: region, // Production region (same as bucket)
124
+ bucketRef: {
125
+ name: bucketName,
126
+ },
127
+ rule: [
128
+ {
129
+ id: 'expire-old-blocks',
130
+ status: 'Enabled',
131
+ expiration: [
132
+ {
133
+ days: config.retention.prometheusS31h, // 730 days (2 years) retention
134
+ },
135
+ ],
136
+ },
137
+ ],
138
+ },
139
+ providerConfigRef: {
140
+ name: 'hetzner-s3',
141
+ },
142
+ },
143
+ });
144
+ }
145
+ }
146
+ exports.ThanosS3BucketConstruct = ThanosS3BucketConstruct;
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhhbm9zLXMzLWJ1Y2tldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzL3RoYW5vcy1zMy1idWNrZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQWtDO0FBQ2xDLDJDQUF1QztBQUN2QyxvRUFBZ0k7QUFPaEk7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUztJQUNwRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTBCO1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQztRQUN6QixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFFaEMsZ0JBQWdCO1FBQ2hCLHNFQUFzRTtRQUN0RSx1RkFBdUY7UUFDdkYsSUFBSSxpQkFBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDNUIsVUFBVSxFQUFFLDJCQUEyQjtZQUN2QyxJQUFJLEVBQUUsUUFBUTtZQUNkLFFBQVEsRUFBRTtnQkFDUixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsU0FBUyxFQUFFLG1CQUFtQjtnQkFDOUIsTUFBTSxFQUFFO29CQUNOLHdCQUF3QixFQUFFLFFBQVE7b0JBQ2xDLDZCQUE2QixFQUFFLFNBQVM7b0JBQ3hDLDhCQUE4QixFQUFFLE9BQU87b0JBQ3ZDLDJCQUEyQixFQUFFLFlBQVk7aUJBQzFDO2dCQUNELFdBQVcsRUFBRTtvQkFDWCw4QkFBOEIsRUFBRSxHQUFHO29CQUNuQyw2QkFBNkIsRUFBRSxVQUFVO29CQUN6QyxhQUFhLEVBQUUscURBQXFEO2lCQUNyRTthQUNGO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixrQkFBa0IsRUFBRTtvQkFDbEIsU0FBUztvQkFDVCxRQUFRO29CQUNSLFFBQVE7b0JBQ1Isd0VBQXdFO2lCQUN6RTtnQkFDRCxXQUFXLEVBQUU7b0JBQ1gsTUFBTSxFQUFFLE1BQU0sRUFBRSwwREFBMEQ7aUJBQzNFO2dCQUNELGlCQUFpQixFQUFFO29CQUNqQixJQUFJLEVBQUUsWUFBWTtpQkFDbkI7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVILDBCQUEwQjtRQUMxQix3Q0FBd0M7UUFDeEMsaUdBQWlHO1FBQ2pHLElBQUksaUJBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQ2hDLFVBQVUsRUFBRSwyQkFBMkI7WUFDdkMsSUFBSSxFQUFFLGtCQUFrQjtZQUN4QixRQUFRLEVBQUU7Z0JBQ1IsSUFBSSxFQUFFLDJCQUEyQjtnQkFDakMsU0FBUyxFQUFFLG1CQUFtQjtnQkFDOUIsTUFBTSxFQUFFO29CQUNOLHdCQUF3QixFQUFFLFFBQVE7b0JBQ2xDLDZCQUE2QixFQUFFLFNBQVM7b0JBQ3hDLDhCQUE4QixFQUFFLE9BQU87b0JBQ3ZDLDJCQUEyQixFQUFFLFlBQVk7aUJBQzFDO2dCQUNELFdBQVcsRUFBRTtvQkFDWCw4QkFBOEIsRUFBRSxHQUFHO2lCQUNwQzthQUNGO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLFdBQVcsRUFBRTtvQkFDWCxNQUFNLEVBQUUsTUFBTSxFQUFFLHFDQUFxQztvQkFDckQsU0FBUyxFQUFFO3dCQUNULElBQUksRUFBRSxVQUFVO3FCQUNqQjtvQkFDRCx1QkFBdUIsRUFBRTt3QkFDdkIsTUFBTSxFQUFFLFNBQVM7cUJBQ2xCO2lCQUNGO2dCQUNELGlCQUFpQixFQUFFO29CQUNqQixJQUFJLEVBQUUsWUFBWTtpQkFDbkI7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVILHNDQUFzQztRQUN0QywyRUFBMkU7UUFDM0UsSUFBSSxnREFBNEIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFO1lBQ2xELFFBQVEsRUFBRTtnQkFDUixJQUFJLEVBQUUsMEJBQTBCO2dCQUNoQyxTQUFTLEVBQUUsbUJBQW1CO2dCQUM5QixNQUFNLEVBQUU7b0JBQ04sd0JBQXdCLEVBQUUsUUFBUTtvQkFDbEMsNkJBQTZCLEVBQUUsU0FBUztvQkFDeEMsOEJBQThCLEVBQUUsT0FBTztvQkFDdkMsMkJBQTJCLEVBQUUsWUFBWTtpQkFDMUM7Z0JBQ0QsV0FBVyxFQUFFO29CQUNYLDhCQUE4QixFQUFFLEdBQUc7aUJBQ3BDO2FBQ0Y7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osa0JBQWtCLEVBQUU7b0JBQ2xCLHNFQUFrRCxDQUFDLE9BQU87b0JBQzFELHNFQUFrRCxDQUFDLE1BQU07b0JBQ3pELHNFQUFrRCxDQUFDLE1BQU07aUJBQzFEO2dCQUNELFdBQVcsRUFBRTtvQkFDWCxNQUFNLEVBQUUsTUFBTSxFQUFFLHFDQUFxQztvQkFDckQsU0FBUyxFQUFFO3dCQUNULElBQUksRUFBRSxVQUFVO3FCQUNqQjtvQkFDRCxJQUFJLEVBQUU7d0JBQ0o7NEJBQ0UsRUFBRSxFQUFFLG1CQUFtQjs0QkFDdkIsTUFBTSxFQUFFLFNBQVM7NEJBQ2pCLFVBQVUsRUFBRTtnQ0FDVjtvQ0FDRSxJQUFJLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsK0JBQStCO2lDQUN2RTs2QkFDRjt5QkFDRjtxQkFDRjtpQkFDRjtnQkFDRCxpQkFBaUIsRUFBRTtvQkFDakIsSUFBSSxFQUFFLFlBQVk7aUJBQ25CO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUE5SEQsMERBOEhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBpT2JqZWN0IH0gZnJvbSAnY2RrOHMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBCdWNrZXRMaWZlY3ljbGVDb25maWd1cmF0aW9uLCBCdWNrZXRMaWZlY3ljbGVDb25maWd1cmF0aW9uU3BlY01hbmFnZW1lbnRQb2xpY2llcyB9IGZyb20gJy4uL2ltcG9ydHMvczMuYXdzLnVwYm91bmQuaW8nO1xuaW1wb3J0IHsgTW9uaXRvcmluZ0NvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBUaGFub3NTM0J1Y2tldFByb3BzIHtcbiAgY29uZmlnOiBNb25pdG9yaW5nQ29uZmlnO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgQ3Jvc3NwbGFuZSBCdWNrZXQgcmVzb3VyY2VzIGZvciBUaGFub3MgbG9uZy10ZXJtIG1ldHJpY3Mgc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGNvbnN0cnVjdCBnZW5lcmF0ZXM6XG4gKiAtIFMzIEJ1Y2tldCAodmlhIENyb3NzcGxhbmUgVXBib3VuZCBwcm92aWRlci1hd3MtczMpXG4gKiAtIEJ1Y2tldFZlcnNpb25pbmcgKGZvciByZWNvdmVyeSlcbiAqIC0gQnVja2V0TGlmZWN5Y2xlQ29uZmlndXJhdGlvbiAoMi15ZWFyIHJldGVudGlvbilcbiAqXG4gKiBQcmVyZXF1aXNpdGVzOlxuICogLSBDcm9zc3BsYW5lIG9wZXJhdG9yIGluc3RhbGxlZFxuICogLSBVcGJvdW5kIHByb3ZpZGVyLWF3cy1zMyBpbnN0YWxsZWRcbiAqIC0gUHJvdmlkZXJDb25maWcgJ2hldHpuZXItczMnIGNvbmZpZ3VyZWQgKHBvaW50cyB0byBIZXR6bmVyIFMzKVxuICogLSBIZXR6bmVyIFMzIGNyZWRlbnRpYWxzIHNlY3JldCBleGlzdHMgaW4gY3Jvc3NwbGFuZS1zeXN0ZW1cbiAqXG4gKiBTeW5jIFdhdmU6IDEgKGV4dGVybmFsIGRlcGVuZGVuY2llcyAtIG11c3QgZXhpc3QgYmVmb3JlIHBvZHMgYWNjZXNzIFMzKVxuICovXG5leHBvcnQgY2xhc3MgVGhhbm9zUzNCdWNrZXRDb25zdHJ1Y3QgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVGhhbm9zUzNCdWNrZXRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCB7IGNvbmZpZyB9ID0gcHJvcHM7XG4gICAgY29uc3QgYnVja2V0TmFtZSA9IGNvbmZpZy5zMy5idWNrZXRzLnRoYW5vcztcbiAgICBjb25zdCByZWdpb24gPSBjb25maWcuczMucmVnaW9uO1xuXG4gICAgLy8gQ3JlYXRlIEJ1Y2tldFxuICAgIC8vIFdhdmUgMTogRXh0ZXJuYWwgRGVwZW5kZW5jaWVzIC0gUzMgYnVja2V0IHByb3Zpc2lvbmVkIGJ5IENyb3NzcGxhbmVcbiAgICAvLyBOb3RlOiBVc2luZyBBcGlPYmplY3QgYmVjYXVzZSBjZGs4cyBpbXBvcnQgbGltaXRhdGlvbnMgcHJldmVudCBpbXBvcnRpbmcgQnVja2V0IHR5cGVcbiAgICBuZXcgQXBpT2JqZWN0KHRoaXMsICdidWNrZXQnLCB7XG4gICAgICBhcGlWZXJzaW9uOiAnczMuYXdzLnVwYm91bmQuaW8vdjFiZXRhMicsXG4gICAgICBraW5kOiAnQnVja2V0JyxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIG5hbWU6IGJ1Y2tldE5hbWUsXG4gICAgICAgIG5hbWVzcGFjZTogJ2Nyb3NzcGxhbmUtc3lzdGVtJyxcbiAgICAgICAgbGFiZWxzOiB7XG4gICAgICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL25hbWUnOiAndGhhbm9zJyxcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50JzogJ3N0b3JhZ2UnLFxuICAgICAgICAgICdhcHAua3ViZXJuZXRlcy5pby9tYW5hZ2VkLWJ5JzogJ2NkazhzJyxcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vcGFydC1vZic6ICdtb25pdG9yaW5nJyxcbiAgICAgICAgfSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAnYXJnb2NkLmFyZ29wcm9qLmlvL3N5bmMtd2F2ZSc6ICcxJyxcbiAgICAgICAgICAnY3Jvc3NwbGFuZS5pby9leHRlcm5hbC1uYW1lJzogYnVja2V0TmFtZSxcbiAgICAgICAgICAnZGVzY3JpcHRpb24nOiAnVGhhbm9zIGxvbmctdGVybSBtZXRyaWNzIHN0b3JhZ2UgKDIteWVhciByZXRlbnRpb24pJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzcGVjOiB7XG4gICAgICAgIGRlbGV0aW9uUG9saWN5OiAnRGVsZXRlJyxcbiAgICAgICAgbWFuYWdlbWVudFBvbGljaWVzOiBbXG4gICAgICAgICAgJ09ic2VydmUnLFxuICAgICAgICAgICdDcmVhdGUnLFxuICAgICAgICAgICdEZWxldGUnLFxuICAgICAgICAgIC8vIFNraXAgVXBkYXRlIHRvIGF2b2lkIHRhZ2dpbmcgb3BlcmF0aW9ucyAobm90IHN1cHBvcnRlZCBieSBIZXR6bmVyIFMzKVxuICAgICAgICBdLFxuICAgICAgICBmb3JQcm92aWRlcjoge1xuICAgICAgICAgIHJlZ2lvbjogcmVnaW9uLCAvLyBQcm9kdWN0aW9uIHJlZ2lvbiAoZW5kcG9pbnQgZGV0ZXJtaW5lcyBhY3R1YWwgbG9jYXRpb24pXG4gICAgICAgIH0sXG4gICAgICAgIHByb3ZpZGVyQ29uZmlnUmVmOiB7XG4gICAgICAgICAgbmFtZTogJ2hldHpuZXItczMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBCdWNrZXRWZXJzaW9uaW5nXG4gICAgLy8gRW5hYmxlIHZlcnNpb25pbmcgZm9yIGJ1Y2tldCByZWNvdmVyeVxuICAgIC8vIE5vdGU6IFVzaW5nIEFwaU9iamVjdCBiZWNhdXNlIGNkazhzIGltcG9ydCBsaW1pdGF0aW9ucyBwcmV2ZW50IGltcG9ydGluZyBCdWNrZXRWZXJzaW9uaW5nIHR5cGVcbiAgICBuZXcgQXBpT2JqZWN0KHRoaXMsICd2ZXJzaW9uaW5nJywge1xuICAgICAgYXBpVmVyc2lvbjogJ3MzLmF3cy51cGJvdW5kLmlvL3YxYmV0YTInLFxuICAgICAga2luZDogJ0J1Y2tldFZlcnNpb25pbmcnLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgbmFtZTogJ3RoYW5vcy1tZXRyaWNzLXZlcnNpb25pbmcnLFxuICAgICAgICBuYW1lc3BhY2U6ICdjcm9zc3BsYW5lLXN5c3RlbScsXG4gICAgICAgIGxhYmVsczoge1xuICAgICAgICAgICdhcHAua3ViZXJuZXRlcy5pby9uYW1lJzogJ3RoYW5vcycsXG4gICAgICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL2NvbXBvbmVudCc6ICdzdG9yYWdlJyxcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSc6ICdjZGs4cycsXG4gICAgICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL3BhcnQtb2YnOiAnbW9uaXRvcmluZycsXG4gICAgICAgIH0sXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgJ2FyZ29jZC5hcmdvcHJvai5pby9zeW5jLXdhdmUnOiAnMScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3BlYzoge1xuICAgICAgICBmb3JQcm92aWRlcjoge1xuICAgICAgICAgIHJlZ2lvbjogcmVnaW9uLCAvLyBQcm9kdWN0aW9uIHJlZ2lvbiAoc2FtZSBhcyBidWNrZXQpXG4gICAgICAgICAgYnVja2V0UmVmOiB7XG4gICAgICAgICAgICBuYW1lOiBidWNrZXROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmVyc2lvbmluZ0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgIHN0YXR1czogJ0VuYWJsZWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHByb3ZpZGVyQ29uZmlnUmVmOiB7XG4gICAgICAgICAgbmFtZTogJ2hldHpuZXItczMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBCdWNrZXRMaWZlY3ljbGVDb25maWd1cmF0aW9uXG4gICAgLy8gTGlmZWN5Y2xlIHBvbGljeTogRGVsZXRlIGRvd25zYW1wbGVkIGJsb2NrcyBhZnRlciAyIHllYXJzIChjb3N0IGNvbnRyb2wpXG4gICAgbmV3IEJ1Y2tldExpZmVjeWNsZUNvbmZpZ3VyYXRpb24odGhpcywgJ2xpZmVjeWNsZScsIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIG5hbWU6ICd0aGFub3MtbWV0cmljcy1saWZlY3ljbGUnLFxuICAgICAgICBuYW1lc3BhY2U6ICdjcm9zc3BsYW5lLXN5c3RlbScsXG4gICAgICAgIGxhYmVsczoge1xuICAgICAgICAgICdhcHAua3ViZXJuZXRlcy5pby9uYW1lJzogJ3RoYW5vcycsXG4gICAgICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL2NvbXBvbmVudCc6ICdzdG9yYWdlJyxcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSc6ICdjZGs4cycsXG4gICAgICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL3BhcnQtb2YnOiAnbW9uaXRvcmluZycsXG4gICAgICAgIH0sXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgJ2FyZ29jZC5hcmdvcHJvai5pby9zeW5jLXdhdmUnOiAnMScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3BlYzoge1xuICAgICAgICBtYW5hZ2VtZW50UG9saWNpZXM6IFtcbiAgICAgICAgICBCdWNrZXRMaWZlY3ljbGVDb25maWd1cmF0aW9uU3BlY01hbmFnZW1lbnRQb2xpY2llcy5PQlNFUlZFLFxuICAgICAgICAgIEJ1Y2tldExpZmVjeWNsZUNvbmZpZ3VyYXRpb25TcGVjTWFuYWdlbWVudFBvbGljaWVzLkNSRUFURSxcbiAgICAgICAgICBCdWNrZXRMaWZlY3ljbGVDb25maWd1cmF0aW9uU3BlY01hbmFnZW1lbnRQb2xpY2llcy5ERUxFVEUsXG4gICAgICAgIF0sXG4gICAgICAgIGZvclByb3ZpZGVyOiB7XG4gICAgICAgICAgcmVnaW9uOiByZWdpb24sIC8vIFByb2R1Y3Rpb24gcmVnaW9uIChzYW1lIGFzIGJ1Y2tldClcbiAgICAgICAgICBidWNrZXRSZWY6IHtcbiAgICAgICAgICAgIG5hbWU6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBydWxlOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnZXhwaXJlLW9sZC1ibG9ja3MnLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdFbmFibGVkJyxcbiAgICAgICAgICAgICAgZXhwaXJhdGlvbjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGRheXM6IGNvbmZpZy5yZXRlbnRpb24ucHJvbWV0aGV1c1MzMWgsIC8vIDczMCBkYXlzICgyIHllYXJzKSByZXRlbnRpb25cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBwcm92aWRlckNvbmZpZ1JlZjoge1xuICAgICAgICAgIG5hbWU6ICdoZXR6bmVyLXMzJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,27 @@
1
+ import { Construct } from 'constructs';
2
+ import { MonitoringConfig } from '../types';
3
+ export interface ThanosS3CredentialsProps {
4
+ namespace: string;
5
+ config: MonitoringConfig;
6
+ }
7
+ /**
8
+ * Creates ExternalSecret for Thanos S3 credentials.
9
+ *
10
+ * This construct replicates Hetzner S3 credentials from crossplane-system
11
+ * namespace to monitoring namespace and transforms them into Thanos objstore.yml format.
12
+ *
13
+ * Prerequisites:
14
+ * - External Secrets Operator installed
15
+ * - ClusterSecretStore 'hetzner-s3-cluster-store' exists (points to crossplane-system)
16
+ * - Secret 'hetzner-s3-creds-standard' exists in crossplane-system namespace
17
+ *
18
+ * Generated Secret:
19
+ * - Name: thanos-objstore-config
20
+ * - Key: objstore.yml
21
+ * - Format: Thanos object storage configuration YAML
22
+ *
23
+ * Sync Wave: 1 (external dependencies - must exist before Thanos components start)
24
+ */
25
+ export declare class ThanosS3CredentialsConstruct extends Construct {
26
+ constructor(scope: Construct, id: string, props: ThanosS3CredentialsProps);
27
+ }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThanosS3CredentialsConstruct = void 0;
4
+ const constructs_1 = require("constructs");
5
+ const external_secrets_io_1 = require("../imports/external-secrets.io");
6
+ /**
7
+ * Creates ExternalSecret for Thanos S3 credentials.
8
+ *
9
+ * This construct replicates Hetzner S3 credentials from crossplane-system
10
+ * namespace to monitoring namespace and transforms them into Thanos objstore.yml format.
11
+ *
12
+ * Prerequisites:
13
+ * - External Secrets Operator installed
14
+ * - ClusterSecretStore 'hetzner-s3-cluster-store' exists (points to crossplane-system)
15
+ * - Secret 'hetzner-s3-creds-standard' exists in crossplane-system namespace
16
+ *
17
+ * Generated Secret:
18
+ * - Name: thanos-objstore-config
19
+ * - Key: objstore.yml
20
+ * - Format: Thanos object storage configuration YAML
21
+ *
22
+ * Sync Wave: 1 (external dependencies - must exist before Thanos components start)
23
+ */
24
+ class ThanosS3CredentialsConstruct extends constructs_1.Construct {
25
+ constructor(scope, id, props) {
26
+ super(scope, id);
27
+ const { namespace, config } = props;
28
+ // Create ExternalSecret that replicates S3 credentials
29
+ // Wave 1: External Dependencies - credentials must exist before Thanos components
30
+ new external_secrets_io_1.ExternalSecret(this, 'thanos-s3-external-secret', {
31
+ metadata: {
32
+ name: 'thanos-s3-credentials-es',
33
+ namespace: namespace,
34
+ labels: {
35
+ 'app.kubernetes.io/name': 'thanos',
36
+ 'app.kubernetes.io/component': 'objstore-config',
37
+ 'app.kubernetes.io/managed-by': 'cdk8s',
38
+ 'app.kubernetes.io/part-of': 'monitoring',
39
+ },
40
+ annotations: {
41
+ 'argocd.argoproj.io/sync-wave': '1',
42
+ },
43
+ },
44
+ spec: {
45
+ // Refresh credentials every hour (automatic rotation support)
46
+ refreshInterval: '1h',
47
+ // Use existing ClusterSecretStore for Hetzner S3 (infrastructure-level secrets)
48
+ secretStoreRef: {
49
+ name: 'hetzner-s3-cluster-store',
50
+ kind: external_secrets_io_1.ExternalSecretSpecSecretStoreRefKind.CLUSTER_SECRET_STORE,
51
+ },
52
+ // Target secret that Thanos sidecar will consume
53
+ target: {
54
+ name: 'thanos-objstore-config',
55
+ creationPolicy: external_secrets_io_1.ExternalSecretSpecTargetCreationPolicy.OWNER,
56
+ // Transform AWS credential format into Thanos objstore.yml
57
+ template: {
58
+ engineVersion: external_secrets_io_1.ExternalSecretSpecTargetTemplateEngineVersion.V2,
59
+ data: {
60
+ 'objstore.yml': `type: S3
61
+ config:
62
+ bucket: "${config.s3.buckets.thanos}"
63
+ endpoint: "${config.s3.endpointNoProtocol}"
64
+ region: ${config.s3.region}
65
+ access_key: {{ .AWS_ACCESS_KEY_ID }}
66
+ secret_key: {{ .AWS_SECRET_ACCESS_KEY }}
67
+ insecure: false
68
+ signature_version2: false
69
+ http_config:
70
+ idle_conn_timeout: 90s
71
+ response_header_timeout: 2m
72
+ insecure_skip_verify: false
73
+ trace:
74
+ enable: false
75
+ part_size: 67108864 # 64MB upload chunks
76
+ `,
77
+ },
78
+ },
79
+ },
80
+ // Fetch S3 credentials from crossplane-system/hetzner-s3-creds-standard
81
+ dataFrom: [
82
+ {
83
+ extract: {
84
+ key: 'hetzner-s3-creds-standard',
85
+ },
86
+ },
87
+ ],
88
+ },
89
+ });
90
+ }
91
+ }
92
+ exports.ThanosS3CredentialsConstruct = ThanosS3CredentialsConstruct;
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhhbm9zLXMzLWNyZWRlbnRpYWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvdGhhbm9zLXMzLWNyZWRlbnRpYWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2Qyx3RUFLd0M7QUFReEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBYSw0QkFBNkIsU0FBUSxzQkFBUztJQUN6RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQStCO1FBQ3ZFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFFcEMsdURBQXVEO1FBQ3ZELGtGQUFrRjtRQUNsRixJQUFJLG9DQUFjLENBQUMsSUFBSSxFQUFFLDJCQUEyQixFQUFFO1lBQ3BELFFBQVEsRUFBRTtnQkFDUixJQUFJLEVBQUUsMEJBQTBCO2dCQUNoQyxTQUFTLEVBQUUsU0FBUztnQkFDcEIsTUFBTSxFQUFFO29CQUNOLHdCQUF3QixFQUFFLFFBQVE7b0JBQ2xDLDZCQUE2QixFQUFFLGlCQUFpQjtvQkFDaEQsOEJBQThCLEVBQUUsT0FBTztvQkFDdkMsMkJBQTJCLEVBQUUsWUFBWTtpQkFDMUM7Z0JBQ0QsV0FBVyxFQUFFO29CQUNYLDhCQUE4QixFQUFFLEdBQUc7aUJBQ3BDO2FBQ0Y7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osOERBQThEO2dCQUM5RCxlQUFlLEVBQUUsSUFBSTtnQkFFckIsZ0ZBQWdGO2dCQUNoRixjQUFjLEVBQUU7b0JBQ2QsSUFBSSxFQUFFLDBCQUEwQjtvQkFDaEMsSUFBSSxFQUFFLDBEQUFvQyxDQUFDLG9CQUFvQjtpQkFDaEU7Z0JBRUQsaURBQWlEO2dCQUNqRCxNQUFNLEVBQUU7b0JBQ04sSUFBSSxFQUFFLHdCQUF3QjtvQkFDOUIsY0FBYyxFQUFFLDREQUFzQyxDQUFDLEtBQUs7b0JBRTVELDJEQUEyRDtvQkFDM0QsUUFBUSxFQUFFO3dCQUNSLGFBQWEsRUFBRSxtRUFBNkMsQ0FBQyxFQUFFO3dCQUMvRCxJQUFJLEVBQUU7NEJBQ0osY0FBYyxFQUFFOzthQUVqQixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNO2VBQ3RCLE1BQU0sQ0FBQyxFQUFFLENBQUMsa0JBQWtCO1lBQy9CLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTTs7Ozs7Ozs7Ozs7O0NBWTNCO3lCQUNZO3FCQUNGO2lCQUNGO2dCQUVELHdFQUF3RTtnQkFDeEUsUUFBUSxFQUFFO29CQUNSO3dCQUNFLE9BQU8sRUFBRTs0QkFDUCxHQUFHLEVBQUUsMkJBQTJCO3lCQUNqQztxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBekVELG9FQXlFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgRXh0ZXJuYWxTZWNyZXQsXG4gIEV4dGVybmFsU2VjcmV0U3BlY1RhcmdldENyZWF0aW9uUG9saWN5LFxuICBFeHRlcm5hbFNlY3JldFNwZWNUYXJnZXRUZW1wbGF0ZUVuZ2luZVZlcnNpb24sXG4gIEV4dGVybmFsU2VjcmV0U3BlY1NlY3JldFN0b3JlUmVmS2luZCxcbn0gZnJvbSAnLi4vaW1wb3J0cy9leHRlcm5hbC1zZWNyZXRzLmlvJztcbmltcG9ydCB7IE1vbml0b3JpbmdDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhhbm9zUzNDcmVkZW50aWFsc1Byb3BzIHtcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIGNvbmZpZzogTW9uaXRvcmluZ0NvbmZpZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIEV4dGVybmFsU2VjcmV0IGZvciBUaGFub3MgUzMgY3JlZGVudGlhbHMuXG4gKlxuICogVGhpcyBjb25zdHJ1Y3QgcmVwbGljYXRlcyBIZXR6bmVyIFMzIGNyZWRlbnRpYWxzIGZyb20gY3Jvc3NwbGFuZS1zeXN0ZW1cbiAqIG5hbWVzcGFjZSB0byBtb25pdG9yaW5nIG5hbWVzcGFjZSBhbmQgdHJhbnNmb3JtcyB0aGVtIGludG8gVGhhbm9zIG9ianN0b3JlLnltbCBmb3JtYXQuXG4gKlxuICogUHJlcmVxdWlzaXRlczpcbiAqIC0gRXh0ZXJuYWwgU2VjcmV0cyBPcGVyYXRvciBpbnN0YWxsZWRcbiAqIC0gQ2x1c3RlclNlY3JldFN0b3JlICdoZXR6bmVyLXMzLWNsdXN0ZXItc3RvcmUnIGV4aXN0cyAocG9pbnRzIHRvIGNyb3NzcGxhbmUtc3lzdGVtKVxuICogLSBTZWNyZXQgJ2hldHpuZXItczMtY3JlZHMtc3RhbmRhcmQnIGV4aXN0cyBpbiBjcm9zc3BsYW5lLXN5c3RlbSBuYW1lc3BhY2VcbiAqXG4gKiBHZW5lcmF0ZWQgU2VjcmV0OlxuICogLSBOYW1lOiB0aGFub3Mtb2Jqc3RvcmUtY29uZmlnXG4gKiAtIEtleTogb2Jqc3RvcmUueW1sXG4gKiAtIEZvcm1hdDogVGhhbm9zIG9iamVjdCBzdG9yYWdlIGNvbmZpZ3VyYXRpb24gWUFNTFxuICpcbiAqIFN5bmMgV2F2ZTogMSAoZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIC0gbXVzdCBleGlzdCBiZWZvcmUgVGhhbm9zIGNvbXBvbmVudHMgc3RhcnQpXG4gKi9cbmV4cG9ydCBjbGFzcyBUaGFub3NTM0NyZWRlbnRpYWxzQ29uc3RydWN0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFRoYW5vc1MzQ3JlZGVudGlhbHNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCB7IG5hbWVzcGFjZSwgY29uZmlnIH0gPSBwcm9wcztcblxuICAgIC8vIENyZWF0ZSBFeHRlcm5hbFNlY3JldCB0aGF0IHJlcGxpY2F0ZXMgUzMgY3JlZGVudGlhbHNcbiAgICAvLyBXYXZlIDE6IEV4dGVybmFsIERlcGVuZGVuY2llcyAtIGNyZWRlbnRpYWxzIG11c3QgZXhpc3QgYmVmb3JlIFRoYW5vcyBjb21wb25lbnRzXG4gICAgbmV3IEV4dGVybmFsU2VjcmV0KHRoaXMsICd0aGFub3MtczMtZXh0ZXJuYWwtc2VjcmV0Jywge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgbmFtZTogJ3RoYW5vcy1zMy1jcmVkZW50aWFscy1lcycsXG4gICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSc6ICd0aGFub3MnLFxuICAgICAgICAgICdhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnQnOiAnb2Jqc3RvcmUtY29uZmlnJyxcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSc6ICdjZGs4cycsXG4gICAgICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL3BhcnQtb2YnOiAnbW9uaXRvcmluZycsXG4gICAgICAgIH0sXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgJ2FyZ29jZC5hcmdvcHJvai5pby9zeW5jLXdhdmUnOiAnMScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3BlYzoge1xuICAgICAgICAvLyBSZWZyZXNoIGNyZWRlbnRpYWxzIGV2ZXJ5IGhvdXIgKGF1dG9tYXRpYyByb3RhdGlvbiBzdXBwb3J0KVxuICAgICAgICByZWZyZXNoSW50ZXJ2YWw6ICcxaCcsXG5cbiAgICAgICAgLy8gVXNlIGV4aXN0aW5nIENsdXN0ZXJTZWNyZXRTdG9yZSBmb3IgSGV0em5lciBTMyAoaW5mcmFzdHJ1Y3R1cmUtbGV2ZWwgc2VjcmV0cylcbiAgICAgICAgc2VjcmV0U3RvcmVSZWY6IHtcbiAgICAgICAgICBuYW1lOiAnaGV0em5lci1zMy1jbHVzdGVyLXN0b3JlJyxcbiAgICAgICAgICBraW5kOiBFeHRlcm5hbFNlY3JldFNwZWNTZWNyZXRTdG9yZVJlZktpbmQuQ0xVU1RFUl9TRUNSRVRfU1RPUkUsXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gVGFyZ2V0IHNlY3JldCB0aGF0IFRoYW5vcyBzaWRlY2FyIHdpbGwgY29uc3VtZVxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICBuYW1lOiAndGhhbm9zLW9ianN0b3JlLWNvbmZpZycsXG4gICAgICAgICAgY3JlYXRpb25Qb2xpY3k6IEV4dGVybmFsU2VjcmV0U3BlY1RhcmdldENyZWF0aW9uUG9saWN5Lk9XTkVSLFxuXG4gICAgICAgICAgLy8gVHJhbnNmb3JtIEFXUyBjcmVkZW50aWFsIGZvcm1hdCBpbnRvIFRoYW5vcyBvYmpzdG9yZS55bWxcbiAgICAgICAgICB0ZW1wbGF0ZToge1xuICAgICAgICAgICAgZW5naW5lVmVyc2lvbjogRXh0ZXJuYWxTZWNyZXRTcGVjVGFyZ2V0VGVtcGxhdGVFbmdpbmVWZXJzaW9uLlYyLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAnb2Jqc3RvcmUueW1sJzogYHR5cGU6IFMzXG5jb25maWc6XG4gIGJ1Y2tldDogXCIke2NvbmZpZy5zMy5idWNrZXRzLnRoYW5vc31cIlxuICBlbmRwb2ludDogXCIke2NvbmZpZy5zMy5lbmRwb2ludE5vUHJvdG9jb2x9XCJcbiAgcmVnaW9uOiAke2NvbmZpZy5zMy5yZWdpb259XG4gIGFjY2Vzc19rZXk6IHt7IC5BV1NfQUNDRVNTX0tFWV9JRCB9fVxuICBzZWNyZXRfa2V5OiB7eyAuQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZIH19XG4gIGluc2VjdXJlOiBmYWxzZVxuICBzaWduYXR1cmVfdmVyc2lvbjI6IGZhbHNlXG4gIGh0dHBfY29uZmlnOlxuICAgIGlkbGVfY29ubl90aW1lb3V0OiA5MHNcbiAgICByZXNwb25zZV9oZWFkZXJfdGltZW91dDogMm1cbiAgICBpbnNlY3VyZV9za2lwX3ZlcmlmeTogZmFsc2VcbiAgdHJhY2U6XG4gICAgZW5hYmxlOiBmYWxzZVxuICBwYXJ0X3NpemU6IDY3MTA4ODY0ICAjIDY0TUIgdXBsb2FkIGNodW5rc1xuYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBGZXRjaCBTMyBjcmVkZW50aWFscyBmcm9tIGNyb3NzcGxhbmUtc3lzdGVtL2hldHpuZXItczMtY3JlZHMtc3RhbmRhcmRcbiAgICAgICAgZGF0YUZyb206IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleHRyYWN0OiB7XG4gICAgICAgICAgICAgIGtleTogJ2hldHpuZXItczMtY3JlZHMtc3RhbmRhcmQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,30 @@
1
+ import { Construct } from 'constructs';
2
+ import { MonitoringConfig } from '../types';
3
+ export interface ThanosStoreProps {
4
+ namespace: string;
5
+ config: MonitoringConfig;
6
+ }
7
+ /**
8
+ * Creates Thanos Store Gateway StatefulSet and Services.
9
+ *
10
+ * Thanos Store Gateway queries historical data from S3 and makes it
11
+ * available via gRPC to Thanos Query. This enables transparent querying
12
+ * of metrics older than the Prometheus local retention (>3 days).
13
+ *
14
+ * Components:
15
+ * - StatefulSet (2 replicas with anti-affinity, 10Gi PVC each for index cache)
16
+ * - gRPC Service (headless, for Thanos Query discovery)
17
+ * - HTTP Service (for debugging and metrics)
18
+ *
19
+ * Prerequisites:
20
+ * - Namespace exists
21
+ * - PriorityClass 'high-priority' exists
22
+ * - Longhorn storage class available
23
+ * - Thanos S3 secret exists (thanos-objstore-config)
24
+ * - S3 bucket contains Prometheus data blocks
25
+ *
26
+ * Sync Wave: 3 (storage gateway - after S3 bucket and credentials)
27
+ */
28
+ export declare class ThanosStoreConstruct extends Construct {
29
+ constructor(scope: Construct, id: string, props: ThanosStoreProps);
30
+ }
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThanosStoreConstruct = void 0;
4
+ const constructs_1 = require("constructs");
5
+ const k8s_1 = require("../imports/k8s");
6
+ /**
7
+ * Creates Thanos Store Gateway StatefulSet and Services.
8
+ *
9
+ * Thanos Store Gateway queries historical data from S3 and makes it
10
+ * available via gRPC to Thanos Query. This enables transparent querying
11
+ * of metrics older than the Prometheus local retention (>3 days).
12
+ *
13
+ * Components:
14
+ * - StatefulSet (2 replicas with anti-affinity, 10Gi PVC each for index cache)
15
+ * - gRPC Service (headless, for Thanos Query discovery)
16
+ * - HTTP Service (for debugging and metrics)
17
+ *
18
+ * Prerequisites:
19
+ * - Namespace exists
20
+ * - PriorityClass 'high-priority' exists
21
+ * - Longhorn storage class available
22
+ * - Thanos S3 secret exists (thanos-objstore-config)
23
+ * - S3 bucket contains Prometheus data blocks
24
+ *
25
+ * Sync Wave: 3 (storage gateway - after S3 bucket and credentials)
26
+ */
27
+ class ThanosStoreConstruct extends constructs_1.Construct {
28
+ constructor(scope, id, props) {
29
+ super(scope, id);
30
+ const { namespace, config } = props;
31
+ // Create StatefulSet
32
+ // Wave 3: Storage Gateway - after S3 bucket and credentials are ready
33
+ new k8s_1.KubeStatefulSet(this, 'statefulset', {
34
+ metadata: {
35
+ name: 'thanos-store',
36
+ namespace: namespace,
37
+ labels: {
38
+ 'app.kubernetes.io/name': 'thanos-store',
39
+ 'app.kubernetes.io/component': 'store-gateway',
40
+ 'app.kubernetes.io/managed-by': 'cdk8s',
41
+ 'app.kubernetes.io/part-of': 'monitoring',
42
+ },
43
+ annotations: {
44
+ 'argocd.argoproj.io/sync-wave': '3',
45
+ },
46
+ },
47
+ spec: {
48
+ serviceName: 'thanos-store',
49
+ replicas: config.replicas.thanosStore,
50
+ selector: {
51
+ matchLabels: {
52
+ 'app.kubernetes.io/name': 'thanos-store',
53
+ },
54
+ },
55
+ template: {
56
+ metadata: {
57
+ labels: {
58
+ 'app.kubernetes.io/name': 'thanos-store',
59
+ 'app.kubernetes.io/component': 'store-gateway',
60
+ },
61
+ },
62
+ spec: {
63
+ // No arch nodeSelector: Thanos images are multi-arch; let the
64
+ // scheduler place these on any worker (the ARM64 pin was a legacy
65
+ // placement onto the cax31 agent pool, now being retired → EX).
66
+ // Spread replicas across different nodes for HA
67
+ affinity: {
68
+ podAntiAffinity: {
69
+ preferredDuringSchedulingIgnoredDuringExecution: [
70
+ {
71
+ weight: 100,
72
+ podAffinityTerm: {
73
+ labelSelector: {
74
+ matchLabels: {
75
+ 'app.kubernetes.io/name': 'thanos-store',
76
+ },
77
+ },
78
+ topologyKey: 'kubernetes.io/hostname',
79
+ },
80
+ },
81
+ ],
82
+ },
83
+ },
84
+ // Fix volume permissions for Thanos user (UID 10001)
85
+ securityContext: {
86
+ fsGroup: 10001,
87
+ runAsUser: 10001,
88
+ runAsNonRoot: true,
89
+ },
90
+ containers: [
91
+ {
92
+ name: 'thanos-store',
93
+ image: `quay.io/thanos/thanos:${config.versions.thanos}`,
94
+ args: [
95
+ 'store',
96
+ '--log.level=info',
97
+ '--data-dir=/var/thanos/store',
98
+ '--objstore.config-file=/etc/thanos/objstore.yml',
99
+ '--index-cache-size=500MB',
100
+ '--chunk-pool-size=500MB',
101
+ ],
102
+ ports: [
103
+ {
104
+ name: 'http',
105
+ containerPort: 10902,
106
+ },
107
+ {
108
+ name: 'grpc',
109
+ containerPort: 10901,
110
+ },
111
+ ],
112
+ volumeMounts: [
113
+ {
114
+ name: 'objstore-config',
115
+ mountPath: '/etc/thanos',
116
+ readOnly: true,
117
+ },
118
+ {
119
+ name: 'data',
120
+ mountPath: '/var/thanos/store',
121
+ },
122
+ ],
123
+ livenessProbe: {
124
+ httpGet: {
125
+ path: '/-/healthy',
126
+ port: k8s_1.IntOrString.fromString('http'),
127
+ },
128
+ initialDelaySeconds: 30,
129
+ periodSeconds: 30,
130
+ },
131
+ readinessProbe: {
132
+ httpGet: {
133
+ path: '/-/ready',
134
+ port: k8s_1.IntOrString.fromString('http'),
135
+ },
136
+ initialDelaySeconds: 30,
137
+ periodSeconds: 5,
138
+ },
139
+ resources: {
140
+ requests: {
141
+ cpu: k8s_1.Quantity.fromString(config.resources.thanosStore.requests.cpu),
142
+ memory: k8s_1.Quantity.fromString(config.resources.thanosStore.requests.memory),
143
+ },
144
+ limits: {
145
+ cpu: k8s_1.Quantity.fromString(config.resources.thanosStore.limits.cpu),
146
+ memory: k8s_1.Quantity.fromString(config.resources.thanosStore.limits.memory),
147
+ },
148
+ },
149
+ },
150
+ ],
151
+ volumes: [
152
+ {
153
+ name: 'objstore-config',
154
+ secret: {
155
+ secretName: 'thanos-objstore-config',
156
+ },
157
+ },
158
+ ],
159
+ priorityClassName: 'high-priority',
160
+ },
161
+ },
162
+ volumeClaimTemplates: [
163
+ {
164
+ metadata: {
165
+ name: 'data',
166
+ },
167
+ spec: {
168
+ accessModes: ['ReadWriteOnce'],
169
+ storageClassName: 'longhorn',
170
+ resources: {
171
+ requests: {
172
+ storage: k8s_1.Quantity.fromString(config.storage.thanosStore), // Cache for S3 index data
173
+ },
174
+ },
175
+ },
176
+ },
177
+ ],
178
+ },
179
+ });
180
+ // Create gRPC Service (headless, for Thanos Query to discover)
181
+ new k8s_1.KubeService(this, 'service-grpc', {
182
+ metadata: {
183
+ name: 'thanos-store-grpc',
184
+ namespace: namespace,
185
+ labels: {
186
+ 'app.kubernetes.io/name': 'thanos-store',
187
+ 'app.kubernetes.io/managed-by': 'cdk8s',
188
+ },
189
+ annotations: {
190
+ 'argocd.argoproj.io/sync-wave': '3',
191
+ },
192
+ },
193
+ spec: {
194
+ type: 'ClusterIP',
195
+ clusterIp: 'None', // Headless service for DNS-based discovery
196
+ ports: [
197
+ {
198
+ name: 'grpc',
199
+ port: 10901,
200
+ targetPort: 'grpc',
201
+ protocol: 'TCP',
202
+ },
203
+ ],
204
+ selector: {
205
+ 'app.kubernetes.io/name': 'thanos-store',
206
+ },
207
+ },
208
+ });
209
+ // Create HTTP Service (for debugging/metrics)
210
+ new k8s_1.KubeService(this, 'service-http', {
211
+ metadata: {
212
+ name: 'thanos-store-http',
213
+ namespace: namespace,
214
+ labels: {
215
+ 'app.kubernetes.io/name': 'thanos-store',
216
+ 'app.kubernetes.io/managed-by': 'cdk8s',
217
+ },
218
+ annotations: {
219
+ 'argocd.argoproj.io/sync-wave': '3',
220
+ },
221
+ },
222
+ spec: {
223
+ ports: [
224
+ {
225
+ name: 'http',
226
+ port: 10902,
227
+ targetPort: 'http',
228
+ protocol: 'TCP',
229
+ },
230
+ ],
231
+ selector: {
232
+ 'app.kubernetes.io/name': 'thanos-store',
233
+ },
234
+ },
235
+ });
236
+ }
237
+ }
238
+ exports.ThanosStoreConstruct = ThanosStoreConstruct;
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhhbm9zLXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvdGhhbm9zLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2Qyx3Q0FBcUY7QUFRckY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBYSxvQkFBcUIsU0FBUSxzQkFBUztJQUNqRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVCO1FBQy9ELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFFcEMscUJBQXFCO1FBQ3JCLHNFQUFzRTtRQUN0RSxJQUFJLHFCQUFlLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtZQUN2QyxRQUFRLEVBQUU7Z0JBQ1IsSUFBSSxFQUFFLGNBQWM7Z0JBQ3BCLFNBQVMsRUFBRSxTQUFTO2dCQUNwQixNQUFNLEVBQUU7b0JBQ04sd0JBQXdCLEVBQUUsY0FBYztvQkFDeEMsNkJBQTZCLEVBQUUsZUFBZTtvQkFDOUMsOEJBQThCLEVBQUUsT0FBTztvQkFDdkMsMkJBQTJCLEVBQUUsWUFBWTtpQkFDMUM7Z0JBQ0QsV0FBVyxFQUFFO29CQUNYLDhCQUE4QixFQUFFLEdBQUc7aUJBQ3BDO2FBQ0Y7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVc7Z0JBQ3JDLFFBQVEsRUFBRTtvQkFDUixXQUFXLEVBQUU7d0JBQ1gsd0JBQXdCLEVBQUUsY0FBYztxQkFDekM7aUJBQ0Y7Z0JBQ0QsUUFBUSxFQUFFO29CQUNSLFFBQVEsRUFBRTt3QkFDUixNQUFNLEVBQUU7NEJBQ04sd0JBQXdCLEVBQUUsY0FBYzs0QkFDeEMsNkJBQTZCLEVBQUUsZUFBZTt5QkFDL0M7cUJBQ0Y7b0JB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d0IsRUFBRSxjQUFjO29CQUN4Qyw4QkFBOEIsRUFBRSxPQUFPO2lCQUN4QztnQkFDRCxXQUFXLEVBQUU7b0JBQ1gsOEJBQThCLEVBQUUsR0FBRztpQkFDcEM7YUFDRjtZQUNELElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUU7b0JBQ0w7d0JBQ0UsSUFBSSxFQUFFLE1BQU07d0JBQ1osSUFBSSxFQUFFLEtBQUs7d0JBQ1gsVUFBVSxFQUFFLE1BQWE7d0JBQ3pCLFFBQVEsRUFBRSxLQUFLO3FCQUNoQjtpQkFDRjtnQkFDRCxRQUFRLEVBQUU7b0JBQ1Isd0JBQXdCLEVBQUUsY0FBYztpQkFDekM7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTNORCxvREEyTkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEt1YmVTdGF0ZWZ1bFNldCwgS3ViZVNlcnZpY2UsIFF1YW50aXR5LCBJbnRPclN0cmluZyB9IGZyb20gJy4uL2ltcG9ydHMvazhzJztcbmltcG9ydCB7IE1vbml0b3JpbmdDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhhbm9zU3RvcmVQcm9wcyB7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xuICBjb25maWc6IE1vbml0b3JpbmdDb25maWc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBUaGFub3MgU3RvcmUgR2F0ZXdheSBTdGF0ZWZ1bFNldCBhbmQgU2VydmljZXMuXG4gKlxuICogVGhhbm9zIFN0b3JlIEdhdGV3YXkgcXVlcmllcyBoaXN0b3JpY2FsIGRhdGEgZnJvbSBTMyBhbmQgbWFrZXMgaXRcbiAqIGF2YWlsYWJsZSB2aWEgZ1JQQyB0byBUaGFub3MgUXVlcnkuIFRoaXMgZW5hYmxlcyB0cmFuc3BhcmVudCBxdWVyeWluZ1xuICogb2YgbWV0cmljcyBvbGRlciB0aGFuIHRoZSBQcm9tZXRoZXVzIGxvY2FsIHJldGVudGlvbiAoPjMgZGF5cykuXG4gKlxuICogQ29tcG9uZW50czpcbiAqIC0gU3RhdGVmdWxTZXQgKDIgcmVwbGljYXMgd2l0aCBhbnRpLWFmZmluaXR5LCAxMEdpIFBWQyBlYWNoIGZvciBpbmRleCBjYWNoZSlcbiAqIC0gZ1JQQyBTZXJ2aWNlIChoZWFkbGVzcywgZm9yIFRoYW5vcyBRdWVyeSBkaXNjb3ZlcnkpXG4gKiAtIEhUVFAgU2VydmljZSAoZm9yIGRlYnVnZ2luZyBhbmQgbWV0cmljcylcbiAqXG4gKiBQcmVyZXF1aXNpdGVzOlxuICogLSBOYW1lc3BhY2UgZXhpc3RzXG4gKiAtIFByaW9yaXR5Q2xhc3MgJ2hpZ2gtcHJpb3JpdHknIGV4aXN0c1xuICogLSBMb25naG9ybiBzdG9yYWdlIGNsYXNzIGF2YWlsYWJsZVxuICogLSBUaGFub3MgUzMgc2VjcmV0IGV4aXN0cyAodGhhbm9zLW9ianN0b3JlLWNvbmZpZylcbiAqIC0gUzMgYnVja2V0IGNvbnRhaW5zIFByb21ldGhldXMgZGF0YSBibG9ja3NcbiAqXG4gKiBTeW5jIFdhdmU6IDMgKHN0b3JhZ2UgZ2F0ZXdheSAtIGFmdGVyIFMzIGJ1Y2tldCBhbmQgY3JlZGVudGlhbHMpXG4gKi9cbmV4cG9ydCBjbGFzcyBUaGFub3NTdG9yZUNvbnN0cnVjdCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUaGFub3NTdG9yZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHsgbmFtZXNwYWNlLCBjb25maWcgfSA9IHByb3BzO1xuXG4gICAgLy8gQ3JlYXRlIFN0YXRlZnVsU2V0XG4gICAgLy8gV2F2ZSAzOiBTdG9yYWdlIEdhdGV3YXkgLSBhZnRlciBTMyBidWNrZXQgYW5kIGNyZWRlbnRpYWxzIGFyZSByZWFkeVxuICAgIG5ldyBLdWJlU3RhdGVmdWxTZXQodGhpcywgJ3N0YXRlZnVsc2V0Jywge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgbmFtZTogJ3RoYW5vcy1zdG9yZScsXG4gICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSc6ICd0aGFub3Mtc3RvcmUnLFxuICAgICAgICAgICdhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnQnOiAnc3RvcmUtZ2F0ZXdheScsXG4gICAgICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL21hbmFnZWQtYnknOiAnY2RrOHMnLFxuICAgICAgICAgICdhcHAua3ViZXJuZXRlcy5pby9wYXJ0LW9mJzogJ21vbml0b3JpbmcnLFxuICAgICAgICB9LFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgICdhcmdvY2QuYXJnb3Byb2ouaW8vc3luYy13YXZlJzogJzMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNwZWM6IHtcbiAgICAgICAgc2VydmljZU5hbWU6ICd0aGFub3Mtc3RvcmUnLFxuICAgICAgICByZXBsaWNhczogY29uZmlnLnJlcGxpY2FzLnRoYW5vc1N0b3JlLFxuICAgICAgICBzZWxlY3Rvcjoge1xuICAgICAgICAgIG1hdGNoTGFiZWxzOiB7XG4gICAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSc6ICd0aGFub3Mtc3RvcmUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlOiB7XG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIGxhYmVsczoge1xuICAgICAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSc6ICd0aGFub3Mtc3RvcmUnLFxuICAgICAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50JzogJ3N0b3JlLWdhdGV3YXknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNwZWM6IHtcbiAgICAgICAgICAgIC8vIE5vIGFyY2ggbm9kZVNlbGVjdG9yOiBUaGFub3MgaW1hZ2VzIGFyZSBtdWx0aS1hcmNoOyBsZXQgdGhlXG4gICAgICAgICAgICAvLyBzY2hlZHVsZXIgcGxhY2UgdGhlc2Ugb24gYW55IHdvcmtlciAodGhlIEFSTTY0IHBpbiB3YXMgYSBsZWdhY3lcbiAgICAgICAgICAgIC8vIHBsYWNlbWVudCBvbnRvIHRoZSBjYXgzMSBhZ2VudCBwb29sLCBub3cgYmVpbmcgcmV0aXJlZCDihpIgRVgpLlxuXG4gICAgICAgICAgICAvLyBTcHJlYWQgcmVwbGljYXMgYWNyb3NzIGRpZmZlcmVudCBub2RlcyBmb3IgSEFcbiAgICAgICAgICAgIGFmZmluaXR5OiB7XG4gICAgICAgICAgICAgIHBvZEFudGlBZmZpbml0eToge1xuICAgICAgICAgICAgICAgIHByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHdlaWdodDogMTAwLFxuICAgICAgICAgICAgICAgICAgICBwb2RBZmZpbml0eVRlcm06IHtcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbFNlbGVjdG9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaExhYmVsczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSc6ICd0aGFub3Mtc3RvcmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5S2V5OiAna3ViZXJuZXRlcy5pby9ob3N0bmFtZScsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBGaXggdm9sdW1lIHBlcm1pc3Npb25zIGZvciBUaGFub3MgdXNlciAoVUlEIDEwMDAxKVxuICAgICAgICAgICAgc2VjdXJpdHlDb250ZXh0OiB7XG4gICAgICAgICAgICAgIGZzR3JvdXA6IDEwMDAxLFxuICAgICAgICAgICAgICBydW5Bc1VzZXI6IDEwMDAxLFxuICAgICAgICAgICAgICBydW5Bc05vblJvb3Q6IHRydWUsXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjb250YWluZXJzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndGhhbm9zLXN0b3JlJyxcbiAgICAgICAgICAgICAgICBpbWFnZTogYHF1YXkuaW8vdGhhbm9zL3RoYW5vczoke2NvbmZpZy52ZXJzaW9ucy50aGFub3N9YCxcbiAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAnc3RvcmUnLFxuICAgICAgICAgICAgICAgICAgJy0tbG9nLmxldmVsPWluZm8nLFxuICAgICAgICAgICAgICAgICAgJy0tZGF0YS1kaXI9L3Zhci90aGFub3Mvc3RvcmUnLFxuICAgICAgICAgICAgICAgICAgJy0tb2Jqc3RvcmUuY29uZmlnLWZpbGU9L2V0Yy90aGFub3Mvb2Jqc3RvcmUueW1sJyxcbiAgICAgICAgICAgICAgICAgICctLWluZGV4LWNhY2hlLXNpemU9NTAwTUInLFxuICAgICAgICAgICAgICAgICAgJy0tY2h1bmstcG9vbC1zaXplPTUwME1CJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHBvcnRzOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdodHRwJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyUG9ydDogMTA5MDIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZ3JwYycsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclBvcnQ6IDEwOTAxLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHZvbHVtZU1vdW50czogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnb2Jqc3RvcmUtY29uZmlnJyxcbiAgICAgICAgICAgICAgICAgICAgbW91bnRQYXRoOiAnL2V0Yy90aGFub3MnLFxuICAgICAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRhJyxcbiAgICAgICAgICAgICAgICAgICAgbW91bnRQYXRoOiAnL3Zhci90aGFub3Mvc3RvcmUnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGxpdmVuZXNzUHJvYmU6IHtcbiAgICAgICAgICAgICAgICAgIGh0dHBHZXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogJy8tL2hlYWx0aHknLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBJbnRPclN0cmluZy5mcm9tU3RyaW5nKCdodHRwJyksXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgaW5pdGlhbERlbGF5U2Vjb25kczogMzAsXG4gICAgICAgICAgICAgICAgICBwZXJpb2RTZWNvbmRzOiAzMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlYWRpbmVzc1Byb2JlOiB7XG4gICAgICAgICAgICAgICAgICBodHRwR2V0OiB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6ICcvLS9yZWFkeScsXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IEludE9yU3RyaW5nLmZyb21TdHJpbmcoJ2h0dHAnKSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBpbml0aWFsRGVsYXlTZWNvbmRzOiAzMCxcbiAgICAgICAgICAgICAgICAgIHBlcmlvZFNlY29uZHM6IDUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IHtcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RzOiB7XG4gICAgICAgICAgICAgICAgICAgIGNwdTogUXVhbnRpdHkuZnJvbVN0cmluZyhjb25maWcucmVzb3VyY2VzLnRoYW5vc1N0b3JlLnJlcXVlc3RzLmNwdSksXG4gICAgICAgICAgICAgICAgICAgIG1lbW9yeTogUXVhbnRpdHkuZnJvbVN0cmluZyhjb25maWcucmVzb3VyY2VzLnRoYW5vc1N0b3JlLnJlcXVlc3RzLm1lbW9yeSksXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgbGltaXRzOiB7XG4gICAgICAgICAgICAgICAgICAgIGNwdTogUXVhbnRpdHkuZnJvbVN0cmluZyhjb25maWcucmVzb3VyY2VzLnRoYW5vc1N0b3JlLmxpbWl0cy5jcHUpLFxuICAgICAgICAgICAgICAgICAgICBtZW1vcnk6IFF1YW50aXR5LmZyb21TdHJpbmcoY29uZmlnLnJlc291cmNlcy50aGFub3NTdG9yZS5saW1pdHMubWVtb3J5KSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG5cbiAgICAgICAgICAgIHZvbHVtZXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdvYmpzdG9yZS1jb25maWcnLFxuICAgICAgICAgICAgICAgIHNlY3JldDoge1xuICAgICAgICAgICAgICAgICAgc2VjcmV0TmFtZTogJ3RoYW5vcy1vYmpzdG9yZS1jb25maWcnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuXG4gICAgICAgICAgICBwcmlvcml0eUNsYXNzTmFtZTogJ2hpZ2gtcHJpb3JpdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHZvbHVtZUNsYWltVGVtcGxhdGVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogJ2RhdGEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNwZWM6IHtcbiAgICAgICAgICAgICAgYWNjZXNzTW9kZXM6IFsnUmVhZFdyaXRlT25jZSddLFxuICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3NOYW1lOiAnbG9uZ2hvcm4nLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0czoge1xuICAgICAgICAgICAgICAgICAgc3RvcmFnZTogUXVhbnRpdHkuZnJvbVN0cmluZyhjb25maWcuc3RvcmFnZS50aGFub3NTdG9yZSksIC8vIENhY2hlIGZvciBTMyBpbmRleCBkYXRhXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgZ1JQQyBTZXJ2aWNlIChoZWFkbGVzcywgZm9yIFRoYW5vcyBRdWVyeSB0byBkaXNjb3ZlcilcbiAgICBuZXcgS3ViZVNlcnZpY2UodGhpcywgJ3NlcnZpY2UtZ3JwYycsIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIG5hbWU6ICd0aGFub3Mtc3RvcmUtZ3JwYycsXG4gICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSc6ICd0aGFub3Mtc3RvcmUnLFxuICAgICAgICAgICdhcHAua3ViZXJuZXRlcy5pby9tYW5hZ2VkLWJ5JzogJ2NkazhzJyxcbiAgICAgICAgfSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAnYXJnb2NkLmFyZ29wcm9qLmlvL3N5bmMtd2F2ZSc6ICczJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzcGVjOiB7XG4gICAgICAgIHR5cGU6ICdDbHVzdGVySVAnLFxuICAgICAgICBjbHVzdGVySXA6ICdOb25lJywgLy8gSGVhZGxlc3Mgc2VydmljZSBmb3IgRE5TLWJhc2VkIGRpc2NvdmVyeVxuICAgICAgICBwb3J0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdncnBjJyxcbiAgICAgICAgICAgIHBvcnQ6IDEwOTAxLFxuICAgICAgICAgICAgdGFyZ2V0UG9ydDogJ2dycGMnIGFzIGFueSxcbiAgICAgICAgICAgIHByb3RvY29sOiAnVENQJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBzZWxlY3Rvcjoge1xuICAgICAgICAgICdhcHAua3ViZXJuZXRlcy5pby9uYW1lJzogJ3RoYW5vcy1zdG9yZScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIEhUVFAgU2VydmljZSAoZm9yIGRlYnVnZ2luZy9tZXRyaWNzKVxuICAgIG5ldyBLdWJlU2VydmljZSh0aGlzLCAnc2VydmljZS1odHRwJywge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgbmFtZTogJ3RoYW5vcy1zdG9yZS1odHRwJyxcbiAgICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICAgIGxhYmVsczoge1xuICAgICAgICAgICdhcHAua3ViZXJuZXRlcy5pby9uYW1lJzogJ3RoYW5vcy1zdG9yZScsXG4gICAgICAgICAgJ2FwcC5rdWJlcm5ldGVzLmlvL21hbmFnZWQtYnknOiAnY2RrOHMnLFxuICAgICAgICB9LFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgICdhcmdvY2QuYXJnb3Byb2ouaW8vc3luYy13YXZlJzogJzMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNwZWM6IHtcbiAgICAgICAgcG9ydHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnaHR0cCcsXG4gICAgICAgICAgICBwb3J0OiAxMDkwMixcbiAgICAgICAgICAgIHRhcmdldFBvcnQ6ICdodHRwJyBhcyBhbnksXG4gICAgICAgICAgICBwcm90b2NvbDogJ1RDUCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgc2VsZWN0b3I6IHtcbiAgICAgICAgICAnYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSc6ICd0aGFub3Mtc3RvcmUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,12 @@
1
+ import { DefaultableConfig, MonitoringConfig, MonitoringConfigInput } from './types';
2
+ /**
3
+ * Package-shipped defaults for everything that has a sensible universal value.
4
+ * Values mirror the kup6s production config at the time of extraction; integration
5
+ * charts override only what they need via {@link mergeConfig}.
6
+ */
7
+ export declare const DEFAULT_CONFIG: DefaultableConfig;
8
+ /**
9
+ * Resolve a full MonitoringConfig by deep-merging the caller's overrides over
10
+ * DEFAULT_CONFIG. Required cluster values are passed through verbatim.
11
+ */
12
+ export declare function mergeConfig(input: MonitoringConfigInput): MonitoringConfig;