configmap-vector.yaml 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: vector-config
  5. namespace: {{ .Release.Namespace }}
  6. labels:
  7. app: vector
  8. data:
  9. vector.toml: |
  10. [sources.kubernetes_logs]
  11. type = "kubernetes_logs"
  12. read_from = "beginning"
  13. fingerprint_lines = 0
  14. max_read_bytes = 262144
  15. glob_minimum_cooldown_ms = 100
  16. max_line_bytes = 102400
  17. ignore_older_secs = 0
  18. data_dir = "/var/lib/vector"
  19. [transforms.parse_and_enrich]
  20. type = "remap"
  21. inputs = ["kubernetes_logs"]
  22. drop_on_abort = false
  23. source = """
  24. # Extract Kubernetes metadata
  25. .pod_name = .kubernetes.pod_name
  26. .namespace = .kubernetes.namespace_name
  27. .container = .kubernetes.container_name
  28. # Initialize app with unknown
  29. .app = "unknown"
  30. # Debug trace fields
  31. .debug_pod = .kubernetes.pod_name
  32. .debug_k8s_label_app = .kubernetes.labels.app
  33. # Check if this is a JSON log (Java/Logstash format with nested JSON)
  34. if exists(.log) {
  35. log_str = string!(.log)
  36. .debug_log_length = length(log_str)
  37. .debug_has_timestamp = contains(log_str, "@timestamp")
  38. if contains(log_str, "@timestamp") {
  39. # Try to parse the nested JSON
  40. parsed = parse_json(log_str) ?? null
  41. if parsed != null {
  42. .debug_parse_success = true
  43. if exists(parsed.app) {
  44. .app = parsed.app
  45. .debug_source = "parsed_json"
  46. .debug_parsed_app = parsed.app
  47. } else {
  48. .debug_parse_no_app = "app_field_missing_in_parsed_json"
  49. }
  50. } else {
  51. .debug_parse_success = false
  52. .debug_parse_error = "parse_json_returned_null"
  53. }
  54. } else {
  55. .debug_no_timestamp = "log_does_not_contain_@timestamp"
  56. }
  57. }
  58. # Fallback to Kubernetes labels if we still don't have app name
  59. if .app == "unknown" && exists(.kubernetes.labels.app) {
  60. .app = .kubernetes.labels.app
  61. .debug_source = "k8s_labels"
  62. .debug_fallback_app = .kubernetes.labels.app
  63. }
  64. .debug_final_app = .app
  65. .env = "kubernetes"
  66. """
  67. [sinks.loki]
  68. type = "loki"
  69. inputs = ["parse_and_enrich"]
  70. endpoint = "{{ .Values.vector.loki.endpoint }}"
  71. encoding.codec = "json"
  72. buffer.type = "memory"
  73. buffer.max_events = 10000
  74. # Use only templating for labels - Vector Loki sink needs raw field access
  75. [sinks.loki.labels]
  76. namespace = "{{ namespace }}"
  77. app = "{{ app }}"
  78. pod = "{{ pod_name }}"
  79. container = "{{ container }}"