|
1 | | ---- |
2 | 1 | apiVersion: v1 |
3 | 2 | kind: ConfigMap |
4 | 3 | metadata: |
@@ -37,17 +36,36 @@ data: |
37 | 36 | - host_metrics |
38 | 37 | - internal_metrics |
39 | 38 | 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"] |
44 | 43 | endpoint: http://loki-write.loki.svc.cluster.local:3100 |
45 | 44 | out_of_order_action: accept |
46 | 45 | 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 }}" |
48 | 57 | 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" |
50 | 67 | labels: |
| 68 | + app: "ingress-nginx" |
51 | 69 | source_type: "{{ .source_type }}" |
52 | 70 | namespace: "{{ kubernetes.pod_namespace }}" |
53 | 71 | container: "{{ kubernetes.container_name }}" |
|
56 | 74 | node: "{{ kubernetes.pod_node_name }}" |
57 | 75 | stream: "{{ .stream }}" |
58 | 76 | 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