Skip to content

Commit 5bf615a

Browse files
pascalfreundsrfPascal Freund
andauthored
[nginx] Add prometheus nginx metrics exporter (CloudPirates-io#224)
* Add prometheus nginx metrics exporter * Fix linting error --------- Co-authored-by: Pascal Freund <[email protected]>
1 parent bdb1946 commit 5bf615a

File tree

8 files changed

+379
-15
lines changed

8 files changed

+379
-15
lines changed

charts/nginx/Chart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: v2
22
name: nginx
33
description: Nginx is a high-performance HTTP server and reverse proxy.
44
type: application
5-
version: 0.1.11
5+
version: 0.1.12
66
appVersion: "1.29.1"
77
keywords:
88
- nginx

charts/nginx/README.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,46 @@ readinessProbe:
306306
| `ingress.tls` | TLS configuration for the Ingress | `[]` |
307307

308308

309+
### Metrics Parameters
310+
311+
| Parameter | Description | Default |
312+
|----------------------------------|--------------------------------------------------------------------|-----------|
313+
| `metrics.enabled` | Start a sidecar Prometheus exporter to expose Nginx metrics | `false` |
314+
| `metrics.image.registry` | Nginx exporter image registry | `docker.io` |
315+
| `metrics.image.repository` | Nginx exporter image repository | `nginx/nginx-prometheus-exporter` |
316+
| `metrics.image.tag` | Nginx exporter image tag | `"1.4@sha256:..."` |
317+
| `metrics.image.pullPolicy` | Nginx exporter image pull policy | `Always` |
318+
| `metrics.resources.limits.memory`| Memory limit for metrics container | `64Mi` |
319+
| `metrics.resources.requests.cpu` | CPU request for metrics container | `50m` |
320+
| `metrics.resources.requests.memory`| Memory request for metrics container | `64Mi` |
321+
| `metrics.extraArgs` | Extra arguments for nginx exporter | `[]` |
322+
| `metrics.service.type` | Metrics service type | `ClusterIP` |
323+
| `metrics.service.port` | Metrics service port | `9113` |
324+
| `metrics.service.annotations` | Additional custom annotations for Metrics service | `{}` |
325+
| `metrics.service.loadBalancerIP` | Load balancer IP if metrics service type is `LoadBalancer` | `""` |
326+
| `metrics.service.loadBalancerSourceRanges` | Allowed addresses for LoadBalancer metrics service | `[]` |
327+
| `metrics.service.clusterIP` | Static clusterIP or None for headless metrics service | `""` |
328+
| `metrics.service.nodePort` | NodePort value for LoadBalancer/NodePort metrics service types | `""` |
329+
| `metrics.serviceMonitor.enabled` | Create ServiceMonitor resource(s) for PrometheusOperator | `false` |
330+
| `metrics.serviceMonitor.namespace`| Namespace for ServiceMonitor resource(s) | `""` |
331+
| `metrics.serviceMonitor.interval`| Interval for scraping metrics | `30s` |
332+
| `metrics.serviceMonitor.scrapeTimeout`| Timeout for scraping metrics | `""` |
333+
| `metrics.serviceMonitor.relabelings`| Additional relabeling of metrics | `[]` |
334+
| `metrics.serviceMonitor.metricRelabelings`| Additional metric relabeling of metrics | `[]` |
335+
| `metrics.serviceMonitor.honorLabels`| Honor metrics labels | `false` |
336+
| `metrics.serviceMonitor.selector`| Prometheus instance selector labels | `{}` |
337+
| `metrics.serviceMonitor.annotations`| Additional annotations for ServiceMonitor | `{}` |
338+
| `metrics.serviceMonitor.namespaceSelector`| Namespace selector for ServiceMonitor | `{}` |
339+
340+
**Note:**
341+
To enable metrics, set `metrics.enabled: true` and ensure your Nginx configuration includes a stub status endpoint, e.g.:
342+
```nginx
343+
location /stub_status {
344+
stub_status on;
345+
}
346+
```
347+
348+
309349
### Extra Configuration Parameters
310350

311351
| Parameter | Description | Default |

charts/nginx/templates/_helpers.tpl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,11 @@ Return the custom NGINX stream server config configmap.
9797
{{- else -}}
9898
{{- include "common.fullname" . -}}
9999
{{- end -}}
100-
{{- end -}}
100+
{{- end -}}
101+
102+
{{/*
103+
Return the proper Nginx metrics image name
104+
*/}}
105+
{{- define "nginx.metrics.image" -}}
106+
{{- include "common.image" (dict "image" .Values.metrics.image "global" .Values.global) -}}
107+
{{- end }}

charts/nginx/templates/deployment.yaml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,49 @@ spec:
202202
{{- toYaml .Values.cloneStaticSiteFromGit.extraVolumeMounts | nindent 12 }}
203203
{{- end }}
204204
{{- end }}
205+
{{- if .Values.metrics.enabled }}
206+
- name: metrics
207+
securityContext: {{ include "common.renderContainerSecurityContext" . | nindent 12 }}
208+
image: {{ include "nginx.metrics.image" . | quote }}
209+
imagePullPolicy: {{ include "common.imagePullPolicy" (dict "image" .Values.metrics.image) }}
210+
command:
211+
- nginx-prometheus-exporter
212+
- --nginx.scrape-uri=http://localhost:8080/stub_status
213+
{{- range .Values.metrics.extraArgs }}
214+
- {{ . }}
215+
{{- end }}
216+
args:
217+
{{- if .Values.metrics.extraArgs }}
218+
{{- range .Values.metrics.extraArgs }}
219+
{{- if not (hasPrefix "--" .) }}
220+
- {{ . }}
221+
{{- end }}
222+
{{- end }}
223+
{{- end }}
224+
ports:
225+
- name: metrics
226+
containerPort: 9113
227+
protocol: TCP
228+
livenessProbe:
229+
httpGet:
230+
path: /
231+
port: metrics
232+
initialDelaySeconds: 15
233+
periodSeconds: 15
234+
timeoutSeconds: 5
235+
failureThreshold: 3
236+
successThreshold: 1
237+
readinessProbe:
238+
httpGet:
239+
path: /
240+
port: metrics
241+
initialDelaySeconds: 5
242+
periodSeconds: 5
243+
timeoutSeconds: 1
244+
failureThreshold: 3
245+
successThreshold: 1
246+
resources: {{- toYaml .Values.metrics.resources | nindent 12 }}
247+
{{- end }}
205248
volumes:
206249
- name: emptydir
207250
emptyDir: {}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{{- if .Values.metrics.enabled }}
2+
apiVersion: v1
3+
kind: Service
4+
metadata:
5+
name: {{ include "nginx.fullname" . }}-metrics
6+
namespace: {{ .Release.Namespace }}
7+
labels:
8+
{{- include "nginx.labels" . | nindent 4 }}
9+
app.kubernetes.io/component: metrics
10+
{{- with .Values.metrics.service.annotations }}
11+
annotations:
12+
{{- toYaml . | nindent 4 }}
13+
{{- end }}
14+
spec:
15+
type: {{ .Values.metrics.service.type }}
16+
{{- if and (eq .Values.metrics.service.type "LoadBalancer") .Values.metrics.service.loadBalancerIP }}
17+
loadBalancerIP: {{ .Values.metrics.service.loadBalancerIP }}
18+
{{- end }}
19+
{{- if and (eq .Values.metrics.service.type "LoadBalancer") .Values.metrics.service.loadBalancerSourceRanges }}
20+
loadBalancerSourceRanges:
21+
{{- range .Values.metrics.service.loadBalancerSourceRanges }}
22+
- {{ . }}
23+
{{- end }}
24+
{{- end }}
25+
{{- if and (eq .Values.metrics.service.type "ClusterIP") .Values.metrics.service.clusterIP }}
26+
clusterIP: {{ .Values.metrics.service.clusterIP }}
27+
{{- end }}
28+
ports:
29+
- name: metrics
30+
port: {{ .Values.metrics.service.port }}
31+
protocol: TCP
32+
targetPort: metrics
33+
{{- if and (or (eq .Values.metrics.service.type "NodePort") (eq .Values.metrics.service.type "LoadBalancer")) .Values.metrics.service.nodePort }}
34+
nodePort: {{ .Values.metrics.service.nodePort }}
35+
{{- end }}
36+
selector:
37+
{{- include "nginx.selectorLabels" . | nindent 4 }}
38+
{{- end }}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
2+
apiVersion: monitoring.coreos.com/v1
3+
kind: ServiceMonitor
4+
metadata:
5+
name: {{ include "nginx.fullname" . }}-metrics
6+
namespace: {{ .Release.Namespace }}
7+
labels:
8+
{{- include "nginx.labels" . | nindent 4 }}
9+
app.kubernetes.io/component: metrics
10+
{{- with .Values.metrics.serviceMonitor.selector }}
11+
{{- toYaml . | nindent 4 }}
12+
{{- end }}
13+
{{- with .Values.metrics.serviceMonitor.annotations }}
14+
annotations:
15+
{{- toYaml . | nindent 4 }}
16+
{{- end }}
17+
spec:
18+
jobLabel: {{ include "nginx.fullname" . }}
19+
selector:
20+
matchLabels:
21+
{{- include "nginx.selectorLabels" . | nindent 6 }}
22+
app.kubernetes.io/component: metrics
23+
endpoints:
24+
- port: metrics
25+
{{- with .Values.metrics.serviceMonitor.interval }}
26+
interval: {{ . }}
27+
{{- end }}
28+
{{- with .Values.metrics.serviceMonitor.scrapeTimeout }}
29+
scrapeTimeout: {{ . }}
30+
{{- end }}
31+
path: /metrics
32+
{{- with .Values.metrics.serviceMonitor.honorLabels }}
33+
honorLabels: {{ . }}
34+
{{- end }}
35+
{{- with .Values.metrics.serviceMonitor.relabelings }}
36+
relabelings:
37+
{{- toYaml . | nindent 8 }}
38+
{{- end }}
39+
{{- with .Values.metrics.serviceMonitor.metricRelabelings }}
40+
metricRelabelings:
41+
{{- toYaml . | nindent 8 }}
42+
{{- end }}
43+
{{- with .Values.metrics.serviceMonitor.namespaceSelector }}
44+
namespaceSelector:
45+
{{- toYaml . | nindent 4 }}
46+
{{- end }}
47+
{{- end }}

0 commit comments

Comments
 (0)