rules: # Each rule represents a some naming and discovery logic. # Each rule is executed independently of the others, so # take care to avoid overlap. As an optimization, rules # with the same `seriesQuery` but different # `name` or `seriesFilters` will use only one query to # Prometheus for discovery. # some of these rules are taken from the "default" configuration, which # can be found in pkg/config/default.go # this rule matches cumulative cAdvisor metrics measured in seconds - seriesQuery: '{__name__=~"^container_.*",container!="POD",namespace!="",pod!=""}' resources: # skip specifying generic resource<->label mappings, and just # attach only pod and namespace resources by mapping label names to group-resources overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} # specify that the `container_` and `_seconds_total` suffixes should be removed. # this also introduces an implicit filter on metric family names name: # we use the value of the capture group implicitly as the API name # we could also explicitly write `as: "$1"` matches: "^container_(.*)_seconds_total$" # specify how to construct a query to fetch samples for a given series # This is a Go template where the `.Series` and `.LabelMatchers` string values # are available, and the delimiters are `<<` and `>>` to avoid conflicts with # the prometheus query language metricsQuery: "sum(rate(<<.Series>>{<<.LabelMatchers>>,container!="POD"}[2m])) by (<<.GroupBy>>)" # this rule matches cumulative cAdvisor metrics not measured in seconds - seriesQuery: '{__name__=~"^container_.*_total",container!="POD",namespace!="",pod!=""}' resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} seriesFilters: # since this is a superset of the query above, we introduce an additional filter here - isNot: "^container_.*_seconds_total$" name: {matches: "^container_(.*)_total$"} metricsQuery: "sum(rate(<<.Series>>{<<.LabelMatchers>>,container!="POD"}[2m])) by (<<.GroupBy>>)" # this rule matches cumulative non-cAdvisor metrics - seriesQuery: '{namespace!="",__name__!="^container_.*"}' name: {matches: "^(.*)_total$"} resources: # specify an a generic mapping between resources and labels. This # is a template, like the `metricsQuery` template, except with the `.Group` # and `.Resource` strings available. It will also be used to match labels, # so avoid using template functions which truncate the group or resource. # Group will be converted to a form acceptible for use as a label automatically. template: "<<.Resource>>" # if we wanted to, we could also specify overrides here metricsQuery: "sum(rate(<<.Series>>{<<.LabelMatchers>>,container!="POD"}[2m])) by (<<.GroupBy>>)" # this rule matches only a single metric, explicitly naming it something else # It's series query *must* return only a single metric family - seriesQuery: 'cheddar{sharp="true"}' # this metric will appear as "cheesy_goodness" in the custom metrics API name: {as: "cheesy_goodness"} resources: overrides: # this should still resolve in our cluster brand: {group: "cheese.io", resource: "brand"} metricsQuery: 'count(cheddar{sharp="true"})' # external rules are not tied to a Kubernetes resource and can reference any metric # https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#autoscaling-on-metrics-not-related-to-kubernetes-objects externalRules: - seriesQuery: '{__name__="queue_consumer_lag",name!=""}' metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (name) - seriesQuery: '{__name__="queue_depth",topic!=""}' metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (name) # Kubernetes metric queries include a namespace in the query by default # but you can explicitly disable namespaces if needed with "namespaced: false" # this is useful if you have an HPA with an external metric in namespace A # but want to query for metrics from namespace B resources: namespaced: false # TODO: should we be able to map to a constant instance of a resource # (e.g. `resources: {constant: [{resource: "namespace", name: "kube-system"}}]`)?