diff --git a/docs/developing-prometheus-rules-and-grafana-dashboards.md b/docs/developing-prometheus-rules-and-grafana-dashboards.md index 2ca2e621c36c3e765eb72446ac55c43ea2953e7f..1a9b3141436d19acb3492b5eaa14d2487630f6eb 100644 --- a/docs/developing-prometheus-rules-and-grafana-dashboards.md +++ b/docs/developing-prometheus-rules-and-grafana-dashboards.md @@ -479,3 +479,39 @@ values+:: { }, } + myMixin.grafanaDashboards ``` + +Full example of including etcd mixin using method described above: + +[embedmd]:# (../examples/mixin-inclusion.jsonnet) +```jsonnet +local addMixin = (import 'kube-prometheus/lib/mixin.libsonnet'); +local etcdMixin = addMixin({ + name: 'etcd', + mixin: (import 'github.com/etcd-io/etcd/contrib/mixin/mixin.libsonnet') + { + _config+: {}, // mixin configuration object + }, +}); + +local kp = (import 'kube-prometheus/main.libsonnet') + + { + values+:: { + common+: { + namespace: 'monitoring', + }, + grafana+: { + // Adding new dashboard to grafana. This will modify grafana configMap with dashboards + dashboards+: etcdMixin.grafanaDashboards, + }, + }, + }; + +{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } + +{ ['0prometheus-operator-' + name]: kp.prometheusOperator[name] for name in std.objectFields(kp.prometheusOperator) } + +{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } + +{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } + +{ ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } + +{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } + +{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } + +// Rendering prometheusRules object. This is an object compatible with prometheus-operator CRD definition for prometheusRule +{ 'external-mixins/etcd-mixin-prometheus-rules': etcdMixin.prometheusRules } +``` diff --git a/examples/mixin-inclusion.jsonnet b/examples/mixin-inclusion.jsonnet new file mode 100644 index 0000000000000000000000000000000000000000..fc75c6283426aa1a077929152b2926a9e661f7af --- /dev/null +++ b/examples/mixin-inclusion.jsonnet @@ -0,0 +1,30 @@ +local addMixin = (import 'kube-prometheus/lib/mixin.libsonnet'); +local etcdMixin = addMixin({ + name: 'etcd', + mixin: (import 'github.com/etcd-io/etcd/contrib/mixin/mixin.libsonnet') + { + _config+: {}, // mixin configuration object + }, +}); + +local kp = (import 'kube-prometheus/main.libsonnet') + + { + values+:: { + common+: { + namespace: 'monitoring', + }, + grafana+: { + // Adding new dashboard to grafana. This will modify grafana configMap with dashboards + dashboards+: etcdMixin.grafanaDashboards, + }, + }, + }; + +{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } + +{ ['0prometheus-operator-' + name]: kp.prometheusOperator[name] for name in std.objectFields(kp.prometheusOperator) } + +{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } + +{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } + +{ ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } + +{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } + +{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } + +// Rendering prometheusRules object. This is an object compatible with prometheus-operator CRD definition for prometheusRule +{ 'external-mixins/etcd-mixin-prometheus-rules': etcdMixin.prometheusRules } diff --git a/jsonnet/kube-prometheus/lib/mixin.libsonnet b/jsonnet/kube-prometheus/lib/mixin.libsonnet index ae39425ddfa49fccfb7d6f95123e6ffe96f72ad6..4c0665eac492b2037dc6342dba0cb70c8abd555e 100644 --- a/jsonnet/kube-prometheus/lib/mixin.libsonnet +++ b/jsonnet/kube-prometheus/lib/mixin.libsonnet @@ -8,29 +8,29 @@ local defaults = { }; function(params) { - config:: defaults + params, + _config:: defaults + params, local m = self, - local prometheusRules = if std.objectHasAll(m.config.mixin, 'prometheusRules') || std.objectHasAll(m.config.mixin, 'prometheusAlerts') then { + local prometheusRules = if std.objectHasAll(m._config.mixin, 'prometheusRules') || std.objectHasAll(m._config.mixin, 'prometheusAlerts') then { apiVersion: 'monitoring.coreos.com/v1', kind: 'PrometheusRule', metadata: { - labels: m.config.labels, - name: m.config.name, - namespace: m.config.namespace, + labels: m._config.labels, + name: m._config.name, + namespace: m._config.namespace, }, spec: { - local r = if std.objectHasAll(m.config.mixin, 'prometheusRules') then m.config.mixin.prometheusRules.groups else [], - local a = if std.objectHasAll(m.config.mixin, 'prometheusAlerts') then m.config.mixin.prometheusAlerts.groups else [], + local r = if std.objectHasAll(m._config.mixin, 'prometheusRules') then m._config.mixin.prometheusRules.groups else [], + local a = if std.objectHasAll(m._config.mixin, 'prometheusAlerts') then m._config.mixin.prometheusAlerts.groups else [], groups: a + r, }, }, - local grafanaDashboards = if std.objectHasAll(m.config.mixin, 'grafanaDashboards') then ( - if std.objectHas(m.config, 'dashboardFolder') then { - [m.config.dashboardFolder]+: m.config.mixin.grafanaDashboards, - } else (m.config.mixin.grafanaDashboards) + local grafanaDashboards = if std.objectHasAll(m._config.mixin, 'grafanaDashboards') then ( + if std.objectHas(m._config, 'dashboardFolder') then { + [m._config.dashboardFolder]+: m._config.mixin.grafanaDashboards, + } else (m._config.mixin.grafanaDashboards) ), prometheusRules: prometheusRules,