config.alloy.j2 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /* Grafana Alloy Configuration
  2. * ---
  3. * Generated by boilerplates CLI
  4. *
  5. * This configuration file is dynamically generated based on your selected
  6. * log and metrics collection options.
  7. *
  8. * For more details, visit https://github.com/grafana/alloy-scenarios
  9. */
  10. // Disable internal traces that are trying to export to Tempo by default
  11. otelcol.exporter.otlp "tempo" {
  12. client {
  13. endpoint = "localhost:4317"
  14. tls {
  15. insecure = true
  16. }
  17. }
  18. }
  19. {% if logs_enabled or metrics_enabled %}
  20. // ============================================================================
  21. // REMOTE ENDPOINTS
  22. // ============================================================================
  23. {% if logs_enabled %}
  24. /* Loki Write Endpoint */
  25. loki.write "default" {
  26. endpoint {
  27. url = "{{ logs_loki_url }}"
  28. // Batching configuration to reduce request volume and prevent rate limiting
  29. batch_wait = "5s" // Wait up to 5 seconds before sending
  30. batch_size = "1MiB" // Send when batch reaches 1MB (1048576 bytes)
  31. }
  32. external_labels = {}
  33. }
  34. {% endif %}
  35. {% if metrics_enabled %}
  36. /* Prometheus Remote Write Endpoint */
  37. prometheus.remote_write "default" {
  38. endpoint {
  39. url = "{{ metrics_prometheus_url }}"
  40. }
  41. }
  42. {% endif %}
  43. {% if logs_enabled %}
  44. // ============================================================================
  45. // LOG COLLECTION
  46. // ============================================================================
  47. {% if logs_docker %}
  48. /* Docker Container Logs */
  49. discovery.docker "dockerlogs" {
  50. host = "unix:///var/run/docker.sock"
  51. }
  52. discovery.relabel "dockerlogs" {
  53. targets = []
  54. rule {
  55. source_labels = ["__meta_docker_container_name"]
  56. regex = "/(.*)"
  57. target_label = "service_name"
  58. }
  59. }
  60. loki.source.docker "default" {
  61. host = "unix:///var/run/docker.sock"
  62. targets = discovery.docker.dockerlogs.targets
  63. labels = {"platform" = "docker"}
  64. relabel_rules = discovery.relabel.dockerlogs.rules
  65. forward_to = [loki.write.default.receiver]
  66. }
  67. {% endif %}
  68. {% if logs_system %}
  69. /* System Logs & Journal */
  70. loki.source.journal "journal" {
  71. max_age = "24h0m0s"
  72. relabel_rules = discovery.relabel.journal.rules
  73. forward_to = [loki.write.default.receiver]
  74. labels = {component = string.format("%s-journal", constants.hostname)}
  75. // NOTE: This is important to fix https://github.com/grafana/alloy/issues/924
  76. path = "/var/log/journal"
  77. }
  78. local.file_match "system" {
  79. path_targets = [{
  80. __address__ = "localhost",
  81. __path__ = "/var/log/{syslog,messages,*.log}",
  82. instance = constants.hostname,
  83. job = string.format("%s-logs", constants.hostname),
  84. }]
  85. }
  86. discovery.relabel "journal" {
  87. targets = []
  88. rule {
  89. source_labels = ["__journal__systemd_unit"]
  90. target_label = "unit"
  91. }
  92. rule {
  93. source_labels = ["__journal__boot_id"]
  94. target_label = "boot_id"
  95. }
  96. rule {
  97. source_labels = ["__journal__transport"]
  98. target_label = "transport"
  99. }
  100. rule {
  101. source_labels = ["__journal_priority_keyword"]
  102. target_label = "level"
  103. }
  104. }
  105. loki.source.file "system" {
  106. targets = local.file_match.system.targets
  107. forward_to = [loki.write.default.receiver]
  108. }
  109. {% endif %}
  110. {% endif %}
  111. {% if metrics_enabled %}
  112. // ============================================================================
  113. // METRICS COLLECTION
  114. // ============================================================================
  115. {% if metrics_docker %}
  116. /* Docker Container Metrics (cAdvisor) */
  117. prometheus.exporter.cadvisor "dockermetrics" {
  118. docker_host = "unix:///var/run/docker.sock"
  119. storage_duration = "5m"
  120. }
  121. /* Relabel component to drop container_spec metrics that often have NaN values */
  122. prometheus.relabel "docker_filter" {
  123. forward_to = [prometheus.remote_write.default.receiver]
  124. rule {
  125. source_labels = ["__name__"]
  126. regex = "container_spec_(cpu_period|cpu_quota|cpu_shares|memory_limit_bytes|memory_swap_limit_bytes|memory_reservation_limit_bytes)"
  127. action = "drop"
  128. }
  129. }
  130. prometheus.scrape "dockermetrics" {
  131. targets = prometheus.exporter.cadvisor.dockermetrics.targets
  132. forward_to = [prometheus.relabel.docker_filter.receiver]
  133. scrape_interval = "10s"
  134. }
  135. {% endif %}
  136. {% if metrics_system %}
  137. /* System (Node) Metrics */
  138. discovery.relabel "metrics" {
  139. targets = prometheus.exporter.unix.metrics.targets
  140. rule {
  141. target_label = "instance"
  142. replacement = constants.hostname
  143. }
  144. rule {
  145. target_label = "job"
  146. replacement = string.format("%s-metrics", constants.hostname)
  147. }
  148. }
  149. prometheus.exporter.unix "metrics" {
  150. disable_collectors = ["ipvs", "btrfs", "infiniband", "xfs", "zfs"]
  151. enable_collectors = ["meminfo"]
  152. rootfs_path = "/rootfs"
  153. filesystem {
  154. fs_types_exclude = "^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|tmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$"
  155. mount_points_exclude = "^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+)($|/)"
  156. mount_timeout = "5s"
  157. }
  158. netclass {
  159. ignored_devices = "^(veth.*|cali.*|[a-f0-9]{15})$"
  160. }
  161. netdev {
  162. device_exclude = "^(veth.*|cali.*|[a-f0-9]{15})$"
  163. }
  164. }
  165. prometheus.scrape "metrics" {
  166. scrape_interval = "15s"
  167. targets = discovery.relabel.metrics.output
  168. forward_to = [prometheus.remote_write.default.receiver]
  169. }
  170. {% endif %}
  171. {% endif %}
  172. {% else %}
  173. // ============================================================================
  174. // NO COLLECTION ENABLED
  175. // ============================================================================
  176. //
  177. // No log or metrics collection is currently enabled.
  178. // To enable collection, set logs_enabled or metrics_enabled to true when
  179. // generating this template.
  180. //
  181. // For more information, visit: https://grafana.com/docs/alloy/latest/
  182. {% endif %}