Skip to content

Commit

Permalink
Add Monitoring support for Cassandra (#1327)
Browse files Browse the repository at this point in the history
Signed-off-by: Sabbir <sabbir@appscode.com>
  • Loading branch information
sabbir-hossain70 authored Oct 31, 2024
1 parent 1f9523e commit 241cc2e
Show file tree
Hide file tree
Showing 11 changed files with 409 additions and 18 deletions.
8 changes: 8 additions & 0 deletions apis/catalog/v1alpha1/cassandra_version_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ type CassandraVersionSpec struct {
// Database Image
DB CassandraVersionDatabase `json:"db"`

// Exporter Image
Exporter CassandraVersionExporter `json:"exporter"`

// Database Image
InitContainer CassandraInitContainer `json:"initContainer"`

Expand All @@ -71,6 +74,11 @@ type CassandraVersionSpec struct {
UI []ChartInfo `json:"ui,omitempty"`
}

// CassandraVersionExporter is the image for the Cassandra exporter
type CassandraVersionExporter struct {
Image string `json:"image"`
}

// CassandraVersionDatabase is the Cassandra Database image
type CassandraVersionDatabase struct {
Image string `json:"image"`
Expand Down
33 changes: 31 additions & 2 deletions apis/catalog/v1alpha1/openapi_generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions apis/catalog/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion apis/kubedb/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -1478,15 +1478,17 @@ const (
CassandraInterNodePort = 7000
CassandraInterNodeSslPort = 7001
CassandraJmxPort = 7199
CassandraExporterPort = 8080

CassandraNativeTcpPortName = "cql"
CassandraInterNodePortName = "internode"
CassandraInterNodeSslPortName = "internode-ssl"
CassandraJmxPortName = "jmx"
CassandraExporterPortName = "exporter"

CassandraUserAdmin = "admin"

CassandraAuthCommand = "/usr/local/bin/docker-entrypoint.sh cassandra -f & /tmp/sc/cassandra-auth.sh"
CassandraAuthCommand = "/tmp/sc/cassandra-auth.sh"
CassandraMetadataName = "metadata.name"
CassandraMetadataNamespace = "metadata.namespace"
CassandraStatusPodIP = "status.podIP"
Expand Down
91 changes: 80 additions & 11 deletions apis/kubedb/v1alpha2/cassandra_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
"kubedb.dev/apimachinery/apis/kubedb"
"kubedb.dev/apimachinery/crds"

promapi "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
"gomodules.xyz/pointer"
core "k8s.io/api/core/v1"
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand All @@ -37,6 +38,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"
)

Expand Down Expand Up @@ -178,6 +180,73 @@ func (r *Cassandra) GetConnectionScheme() string {
return scheme
}

func (r *Cassandra) OffShootSelectors(extraSelectors ...map[string]string) map[string]string {
selector := map[string]string{
meta_util.NameLabelKey: r.ResourceFQN(),
meta_util.InstanceLabelKey: r.Name,
meta_util.ManagedByLabelKey: kubedb.GroupName,
}
return meta_util.OverwriteKeys(selector, extraSelectors...)
}

func (r *Cassandra) offShootLabels(selector, override map[string]string) map[string]string {
selector[meta_util.ComponentLabelKey] = kubedb.ComponentDatabase
return meta_util.FilterKeys(kubedb.GroupName, selector, meta_util.OverwriteKeys(nil, r.Labels, override))
}

func (r *Cassandra) OffShootLabels() map[string]string {
return r.offShootLabels(r.OffShootSelectors(), nil)
}

func (r *Cassandra) ServiceLabels(alias ServiceAlias, extraLabels ...map[string]string) map[string]string {
svcTemplate := GetServiceTemplate(r.Spec.ServiceTemplates, alias)
return r.offShootLabels(meta_util.OverwriteKeys(r.OffShootSelectors(), extraLabels...), svcTemplate.Labels)
}

func (r *Cassandra) OffShootName() string {
return r.Name
}

type CassandraStatsService struct {
*Cassandra
}

func (ks CassandraStatsService) TLSConfig() *promapi.TLSConfig {
return nil
}

func (ks CassandraStatsService) GetNamespace() string {
return ks.Cassandra.GetNamespace()
}

func (ks CassandraStatsService) ServiceName() string {
return ks.OffShootName() + "-stats"
}

func (ks CassandraStatsService) ServiceMonitorName() string {
return ks.ServiceName()
}

func (ks CassandraStatsService) ServiceMonitorAdditionalLabels() map[string]string {
return ks.OffshootLabels()
}

func (ks CassandraStatsService) Path() string {
return kubedb.DefaultStatsPath
}

func (ks CassandraStatsService) Scheme() string {
return ""
}

func (r *Cassandra) StatsService() mona.StatsAccessor {
return &CassandraStatsService{r}
}

func (r *Cassandra) StatsServiceLabels() map[string]string {
return r.ServiceLabels(StatsServiceAlias, map[string]string{kubedb.LabelRole: kubedb.RoleStats})
}

func (r *Cassandra) SetHealthCheckerDefaults() {
if r.Spec.HealthChecker.PeriodSeconds == nil {
r.Spec.HealthChecker.PeriodSeconds = pointer.Int32P(30)
Expand All @@ -203,17 +272,6 @@ func (r *Cassandra) SetDefaults() {
r.Spec.DeletionPolicy = TerminationPolicyDelete
}

if !r.Spec.DisableSecurity {
if r.Spec.AuthSecret == nil {
r.Spec.AuthSecret = &SecretReference{
LocalObjectReference: core.LocalObjectReference{
Name: r.DefaultUserCredSecretName(kubedb.CassandraUserAdmin),
},
ExternallyManaged: false,
}
}
}

var casVersion catalog.CassandraVersion
err := DefaultClient.Get(context.TODO(), types.NamespacedName{
Name: r.Spec.Version,
Expand Down Expand Up @@ -274,6 +332,17 @@ func (r *Cassandra) SetDefaults() {
}
r.SetHealthCheckerDefaults()
}

r.Spec.Monitor.SetDefaults()

if r.Spec.Monitor != nil && r.Spec.Monitor.Prometheus != nil {
if r.Spec.Monitor.Prometheus.Exporter.SecurityContext.RunAsUser == nil {
r.Spec.Monitor.Prometheus.Exporter.SecurityContext.RunAsUser = casVersion.Spec.SecurityContext.RunAsUser
}
if r.Spec.Monitor.Prometheus.Exporter.SecurityContext.RunAsGroup == nil {
r.Spec.Monitor.Prometheus.Exporter.SecurityContext.RunAsGroup = casVersion.Spec.SecurityContext.RunAsUser
}
}
}

func (r *Cassandra) setDefaultContainerSecurityContext(csVersion *catalog.CassandraVersion, podTemplate *ofst.PodTemplateSpec) {
Expand Down
5 changes: 5 additions & 0 deletions apis/kubedb/v1alpha2/cassandra_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand Down Expand Up @@ -90,6 +91,10 @@ type CassandraSpec struct {
// +optional
ServiceTemplates []NamedServiceTemplateSpec `json:"serviceTemplates,omitempty"`

// Monitor is used monitor database instance
// +optional
Monitor *mona.AgentSpec `json:"monitor,omitempty"`

// DeletionPolicy controls the delete operation for database
// +optional
DeletionPolicy TerminationPolicy `json:"deletionPolicy,omitempty"`
Expand Down
5 changes: 2 additions & 3 deletions apis/kubedb/v1alpha2/cassandra_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,10 +230,9 @@ func (c *Cassandra) validateClusterStorageType(rack RackSpec, allErr field.Error
}

func (r *Cassandra) ValidateVersion(db *Cassandra) error {
chVersion := catalog.CassandraVersion{}
err := DefaultClient.Get(context.TODO(), types.NamespacedName{Name: db.Spec.Version}, &chVersion)
casVersion := catalog.CassandraVersion{}
err := DefaultClient.Get(context.TODO(), types.NamespacedName{Name: db.Spec.Version}, &casVersion)
if err != nil {
// fmt.Sprint(db.Spec.Version, "version not supported")
return errors.New(fmt.Sprint("version ", db.Spec.Version, " not supported"))
}
return nil
Expand Down
29 changes: 28 additions & 1 deletion apis/kubedb/v1alpha2/openapi_generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 26 additions & 0 deletions apis/kubedb/v1alpha2/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 241cc2e

Please sign in to comment.