Skip to content

Commit 067a5e6

Browse files
committed
fix(vector-agent): Handle nginx logs
This change adds parsing of ingress-nginx logs to add labels specific for fields that occur in them. This includes attributes like host, status, and method, allowing better log discovery.
1 parent b032bbd commit 067a5e6

File tree

1 file changed

+79
-7
lines changed

1 file changed

+79
-7
lines changed

platform/vector-agent/do/configmap-vector-agent.yaml

Lines changed: 79 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
---
21
apiVersion: v1
32
kind: ConfigMap
43
metadata:
@@ -37,17 +36,36 @@ data:
3736
- host_metrics
3837
- internal_metrics
3938
address: 0.0.0.0:9090
40-
loki:
41-
type: loki
42-
inputs:
43-
- kubernetes_logs
39+
# Sink for other Kubernetes logs
40+
loki_kubernetes:
41+
type: "loki"
42+
inputs: ["process_other_logs"]
4443
endpoint: http://loki-write.loki.svc.cluster.local:3100
4544
out_of_order_action: accept
4645
encoding:
47-
codec: json
46+
codec: "json"
47+
labels:
48+
source_type: "{{ .source_type }}"
49+
namespace: "{{ kubernetes.pod_namespace }}"
50+
container: "{{ kubernetes.container_name }}"
51+
pod: "{{ kubernetes.pod_name }}"
52+
container_name: "{{ kubernetes.container_name }}"
53+
node: "{{ kubernetes.pod_node_name }}"
54+
stream: "{{ .stream }}"
55+
forwarder: vector-agent
56+
log_type: "{{ log_type }}"
4857
healthcheck:
49-
enabled: false
58+
enabled: true
59+
# Sink for ingress-nginx logs
60+
loki_nginx:
61+
type: "loki"
62+
inputs: ["parse_nginx"]
63+
endpoint: http://loki-write.loki.svc.cluster.local:3100
64+
out_of_order_action: accept
65+
encoding:
66+
codec: "json"
5067
labels:
68+
app: "ingress-nginx"
5169
source_type: "{{ .source_type }}"
5270
namespace: "{{ kubernetes.pod_namespace }}"
5371
container: "{{ kubernetes.container_name }}"
@@ -56,3 +74,57 @@ data:
5674
node: "{{ kubernetes.pod_node_name }}"
5775
stream: "{{ .stream }}"
5876
forwarder: vector-agent
77+
log_type: "{{ log_type }}"
78+
host: "{{ host }}"
79+
status: "{{ status }}"
80+
method: "{{ method }}"
81+
healthcheck:
82+
enabled: true
83+
84+
transforms:
85+
# Filter and process ingress-nginx logs
86+
filter_nginx:
87+
type: "filter"
88+
inputs: ["kubernetes_logs"]
89+
condition: '.kubernetes.container_name == "controller" && .kubernetes.pod_namespace == "ingress-nginx"'
90+
91+
parse_nginx:
92+
type: "remap"
93+
inputs: ["filter_nginx"]
94+
source: |
95+
.log_type = "ingress-nginx"
96+
# Parse the log line which is in the .message field
97+
if is_string(.message) && contains(string!(.message), "{") {
98+
parsed, err = parse_json(.message)
99+
if err != null {
100+
log("Failed to parse JSON: " + err + "\n" + string!(.message), level: "info")
101+
.parse_error = true
102+
} else {
103+
# Merge the parsed fields into the root document
104+
. = merge!(., parsed)
105+
}
106+
}
107+
108+
# Handle timestamp if present
109+
if exists(.time) {
110+
.timestamp = parse_timestamp!(.time, format: "%Y-%m-%dT%H:%M:%S%z")
111+
}
112+
113+
# Ensure all label fields exist to prevent null labels
114+
if !exists(.host) { .host = "unknown" }
115+
if !exists(.status) { .status = 0 }
116+
if !exists(.method) { .method = "unknown" }
117+
118+
# Filter for all other Kubernetes logs
119+
filter_other_logs:
120+
type: "filter"
121+
inputs: ["kubernetes_logs"]
122+
condition: '.kubernetes.container_name != "controller" || .kubernetes.pod_namespace != "ingress-nginx"'
123+
124+
# Process other Kubernetes logs
125+
process_other_logs:
126+
type: "remap"
127+
inputs: ["filter_other_logs"]
128+
source: |
129+
# Add a log type for non-nginx logs
130+
.log_type = "kubernetes"

0 commit comments

Comments
 (0)