diff --git a/apis/kubedb/v1alpha2/constants.go b/apis/kubedb/v1alpha2/constants.go index bf966580e5..982f03fc8c 100644 --- a/apis/kubedb/v1alpha2/constants.go +++ b/apis/kubedb/v1alpha2/constants.go @@ -952,8 +952,26 @@ const ( DruidExtensionPostgreSQLMetadataStorage = "postgresql-metadata-storage" DruidExtensionBasicSecurity = "druid-basic-security" DruidExtensionMultiStageQuery = "druid-multi-stage-query" + DruidExtensionPrometheusEmitter = "prometheus-emitter" DruidService = "druid.service" + // Monitoring Configurations + DruidEmitter = "druid.emitter" + DruidEmitterPrometheus = "prometheus" + DruidEmitterPrometheusPortKey = "druid.emitter.prometheus.port" + DruidEmitterPrometheusPortVal = 8080 + DruidMonitoringMonitorsKey = "druid.monitoring.monitors" + DruidEmitterPrometheusStrategy = "druid.emitter.prometheus.strategy" + DruidMetricsJVMMonitor = "org.apache.druid.java.util.metrics.JvmMonitor" + DruidMetricsServiceStatusMonitor = "org.apache.druid.server.metrics.ServiceStatusMonitor" + DruidMetricsQueryCountStatsMonitor = "org.apache.druid.server.metrics.QueryCountStatsMonitor" + DruidMonitoringHistoricalMetricsMonitor = "org.apache.druid.server.metrics.HistoricalMetricsMonitor" + DruidMonitoringSegmentsStatsMonitor = "org.apache.druid.server.metrics.SegmentStatsMonitor" + DruidMonitoringWorkerTaskCountsStatsMonitor = "org.apache.druid.server.metrics.WorkerTaskCountStatsMonitor" + DruidMonitoringQueryCountStatsMonitor = "org.apache.druid.server.metrics.QueryCountStatsMonitor" + DruidMonitoringTaskCountStatsMonitor = "org.apache.druid.server.metrics.TaskCountStatsMonitor" + DruidMonitoringSysMonitor = "org.apache.druid.java.util.metrics.SysMonitor" + /// Coordinators Configurations DruidCoordinatorStartDelay = "druid.coordinator.startDelay" DruidCoordinatorPeriod = "druid.coordinator.period" @@ -973,6 +991,8 @@ const ( DruidIndexerLogsKillInitialDelay = "druid.indexer.logs.kill.initialDelay" DruidIndexerLogsKillDelay = "druid.indexer.logs.kill.delay" + DruidEmitterLoggingLogLevel = "druid.emitter.logging.logLevel" + /// Historicals Configurations // Properties DruidProcessingNumOfThreads = "druid.processing.numThreads" diff --git a/apis/kubedb/v1alpha2/druid_helpers.go b/apis/kubedb/v1alpha2/druid_helpers.go index 2e0d78ea61..e3515ab210 100644 --- a/apis/kubedb/v1alpha2/druid_helpers.go +++ b/apis/kubedb/v1alpha2/druid_helpers.go @@ -28,6 +28,7 @@ import ( "kubedb.dev/apimachinery/crds" "github.com/Masterminds/semver/v3" + promapi "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" "gomodules.xyz/pointer" v1 "k8s.io/api/core/v1" meta "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -39,6 +40,7 @@ import ( meta_util "kmodules.xyz/client-go/meta" "kmodules.xyz/client-go/policy/secomp" appcat "kmodules.xyz/custom-resources/apis/appcatalog/v1alpha1" + mona "kmodules.xyz/monitoring-agent-api/api/v1" ofst "kmodules.xyz/offshoot-api/api/v2" pslister "kubeops.dev/petset/client/listers/apps/v1" ) @@ -126,6 +128,46 @@ func (d *Druid) DefaultUserCredSecretName(username string) string { return meta_util.NameWithSuffix(d.Name, strings.ReplaceAll(fmt.Sprintf("%s-cred", username), "_", "-")) } +type DruidStatsService struct { + *Druid +} + +func (ks DruidStatsService) TLSConfig() *promapi.TLSConfig { + return nil +} + +func (ks DruidStatsService) GetNamespace() string { + return ks.Druid.GetNamespace() +} + +func (ks DruidStatsService) ServiceName() string { + return ks.OffShootName() + "-stats" +} + +func (ks DruidStatsService) ServiceMonitorName() string { + return ks.ServiceName() +} + +func (ks DruidStatsService) ServiceMonitorAdditionalLabels() map[string]string { + return ks.OffshootLabels() +} + +func (ks DruidStatsService) Path() string { + return DefaultStatsPath +} + +func (ks DruidStatsService) Scheme() string { + return "" +} + +func (d *Druid) StatsService() mona.StatsAccessor { + return &DruidStatsService{d} +} + +func (d *Druid) StatsServiceLabels() map[string]string { + return d.ServiceLabels(StatsServiceAlias, map[string]string{LabelRole: RoleStats}) +} + func (d *Druid) ConfigSecretName() string { return meta_util.NameWithSuffix(d.OffShootName(), "config") } diff --git a/apis/kubedb/v1alpha2/druid_types.go b/apis/kubedb/v1alpha2/druid_types.go index c33f58cc01..51a6335f3a 100644 --- a/apis/kubedb/v1alpha2/druid_types.go +++ b/apis/kubedb/v1alpha2/druid_types.go @@ -20,6 +20,7 @@ import ( core "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kmapi "kmodules.xyz/client-go/api/v1" + mona "kmodules.xyz/monitoring-agent-api/api/v1" ofst "kmodules.xyz/offshoot-api/api/v2" ) @@ -106,6 +107,10 @@ type DruidSpec struct { // +optional Halted bool `json:"halted,omitempty"` + // Monitor is used monitor database instance + // +optional + Monitor *mona.AgentSpec `json:"monitor,omitempty"` + // TerminationPolicy controls the delete operation for database // +optional TerminationPolicy TerminationPolicy `json:"terminationPolicy,omitempty"` diff --git a/apis/kubedb/v1alpha2/openapi_generated.go b/apis/kubedb/v1alpha2/openapi_generated.go index 9acffea52d..019e568d5f 100644 --- a/apis/kubedb/v1alpha2/openapi_generated.go +++ b/apis/kubedb/v1alpha2/openapi_generated.go @@ -472,6 +472,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.DruidList": schema_apimachinery_apis_kubedb_v1alpha2_DruidList(ref), "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.DruidNode": schema_apimachinery_apis_kubedb_v1alpha2_DruidNode(ref), "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.DruidSpec": schema_apimachinery_apis_kubedb_v1alpha2_DruidSpec(ref), + "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.DruidStatsService": schema_apimachinery_apis_kubedb_v1alpha2_DruidStatsService(ref), "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.DruidStatus": schema_apimachinery_apis_kubedb_v1alpha2_DruidStatus(ref), "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.Elasticsearch": schema_apimachinery_apis_kubedb_v1alpha2_Elasticsearch(ref), "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.ElasticsearchClusterTopology": schema_apimachinery_apis_kubedb_v1alpha2_ElasticsearchClusterTopology(ref), @@ -23552,6 +23553,12 @@ func schema_apimachinery_apis_kubedb_v1alpha2_DruidSpec(ref common.ReferenceCall Format: "", }, }, + "monitor": { + SchemaProps: spec.SchemaProps{ + Description: "Monitor is used monitor database instance", + Ref: ref("kmodules.xyz/monitoring-agent-api/api/v1.AgentSpec"), + }, + }, "terminationPolicy": { SchemaProps: spec.SchemaProps{ Description: "TerminationPolicy controls the delete operation for database", @@ -23571,7 +23578,27 @@ func schema_apimachinery_apis_kubedb_v1alpha2_DruidSpec(ref common.ReferenceCall }, }, Dependencies: []string{ - "k8s.io/api/core/v1.LocalObjectReference", "kmodules.xyz/client-go/api/v1.HealthCheckSpec", "kmodules.xyz/offshoot-api/api/v2.PodTemplateSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.DeepStorageSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.DruidClusterTopology", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.MetadataStorage", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.NamedServiceTemplateSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.ZookeeperRef"}, + "k8s.io/api/core/v1.LocalObjectReference", "kmodules.xyz/client-go/api/v1.HealthCheckSpec", "kmodules.xyz/monitoring-agent-api/api/v1.AgentSpec", "kmodules.xyz/offshoot-api/api/v2.PodTemplateSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.DeepStorageSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.DruidClusterTopology", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.MetadataStorage", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.NamedServiceTemplateSpec", "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.ZookeeperRef"}, + } +} + +func schema_apimachinery_apis_kubedb_v1alpha2_DruidStatsService(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "Druid": { + SchemaProps: spec.SchemaProps{ + Ref: ref("kubedb.dev/apimachinery/apis/kubedb/v1alpha2.Druid"), + }, + }, + }, + Required: []string{"Druid"}, + }, + }, + Dependencies: []string{ + "kubedb.dev/apimachinery/apis/kubedb/v1alpha2.Druid"}, } } diff --git a/apis/kubedb/v1alpha2/zz_generated.deepcopy.go b/apis/kubedb/v1alpha2/zz_generated.deepcopy.go index a17ac1ded3..902842860a 100644 --- a/apis/kubedb/v1alpha2/zz_generated.deepcopy.go +++ b/apis/kubedb/v1alpha2/zz_generated.deepcopy.go @@ -538,6 +538,11 @@ func (in *DruidSpec) DeepCopyInto(out *DruidSpec) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.Monitor != nil { + in, out := &in.Monitor, &out.Monitor + *out = new(monitoringagentapiapiv1.AgentSpec) + (*in).DeepCopyInto(*out) + } in.HealthChecker.DeepCopyInto(&out.HealthChecker) return } @@ -552,6 +557,27 @@ func (in *DruidSpec) DeepCopy() *DruidSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DruidStatsService) DeepCopyInto(out *DruidStatsService) { + *out = *in + if in.Druid != nil { + in, out := &in.Druid, &out.Druid + *out = new(Druid) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DruidStatsService. +func (in *DruidStatsService) DeepCopy() *DruidStatsService { + if in == nil { + return nil + } + out := new(DruidStatsService) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DruidStatus) DeepCopyInto(out *DruidStatus) { *out = *in diff --git a/crds/kubedb.com_druids.yaml b/crds/kubedb.com_druids.yaml index 2c078661b9..83ccef40bd 100644 --- a/crds/kubedb.com_druids.yaml +++ b/crds/kubedb.com_druids.yaml @@ -112,6 +112,194 @@ spec: required: - name type: object + monitor: + properties: + agent: + enum: + - prometheus.io/operator + - prometheus.io + - prometheus.io/builtin + type: string + prometheus: + properties: + exporter: + properties: + args: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + port: + default: 56790 + format: int32 + type: integer + resources: + properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + type: object + serviceMonitor: + properties: + interval: + type: string + labels: + additionalProperties: + type: string + type: object + type: object + type: object + type: object podTemplate: properties: controller: