@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.
- package/CLAUDE.md +76 -0
- package/LICENSE +202 -0
- package/README.md +87 -0
- package/examples/synth.ts +17 -0
- package/lib/constructs/alloy.d.ts +29 -0
- package/lib/constructs/alloy.js +214 -0
- package/lib/constructs/grafana-password-secret.d.ts +57 -0
- package/lib/constructs/grafana-password-secret.js +99 -0
- package/lib/constructs/loki-s3-bucket.d.ts +24 -0
- package/lib/constructs/loki-s3-bucket.js +147 -0
- package/lib/constructs/loki-s3-credentials.d.ts +27 -0
- package/lib/constructs/loki-s3-credentials.js +71 -0
- package/lib/constructs/loki.d.ts +30 -0
- package/lib/constructs/loki.js +185 -0
- package/lib/constructs/namespace.d.ts +13 -0
- package/lib/constructs/namespace.js +34 -0
- package/lib/constructs/priority-class.d.ts +12 -0
- package/lib/constructs/priority-class.js +38 -0
- package/lib/constructs/prometheus-stack.d.ts +30 -0
- package/lib/constructs/prometheus-stack.js +477 -0
- package/lib/constructs/thanos-compactor.d.ts +35 -0
- package/lib/constructs/thanos-compactor.js +198 -0
- package/lib/constructs/thanos-query.d.ts +30 -0
- package/lib/constructs/thanos-query.js +205 -0
- package/lib/constructs/thanos-s3-bucket.d.ts +24 -0
- package/lib/constructs/thanos-s3-bucket.js +147 -0
- package/lib/constructs/thanos-s3-credentials.d.ts +27 -0
- package/lib/constructs/thanos-s3-credentials.js +93 -0
- package/lib/constructs/thanos-store.d.ts +30 -0
- package/lib/constructs/thanos-store.js +239 -0
- package/lib/default-config.d.ts +12 -0
- package/lib/default-config.js +77 -0
- package/lib/imports/external-secrets.io.d.ts +39243 -0
- package/lib/imports/external-secrets.io.js +23112 -0
- package/lib/imports/generators.external-secrets.io.d.ts +7831 -0
- package/lib/imports/generators.external-secrets.io.js +4895 -0
- package/lib/imports/k8s.d.ts +24537 -0
- package/lib/imports/k8s.js +18268 -0
- package/lib/imports/s3.aws.upbound.io.d.ts +2882 -0
- package/lib/imports/s3.aws.upbound.io.js +1828 -0
- package/lib/index.d.ts +17 -0
- package/lib/index.js +38 -0
- package/lib/monitoring-chart.d.ts +39 -0
- package/lib/monitoring-chart.js +127 -0
- package/lib/types.d.ts +142 -0
- package/lib/types.js +3 -0
- 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;
|