Tài liệu hướng dẫn cấu hình Alloy để thu thập Metrics, Logs từ ứng dụng MySQL

1. Chuẩn bị

1.1 Cài đặt alloy trên VM

Thực hiện cài đặt Alloy Agent trên máy chủ Linux bằng lệnh sau:

/bin/sh -c "$(curl -fsSL https://s3hn.smartcloud.vn/agent/alloy/linux/releases/v1.8.3/install-linux.sh)"

1.2 Tạo một User trong MySQL để lấy metrics

CREATE USER 'mysql-exporter'@'%' IDENTIFIED BY 'password' WITH MAX_USER_CONNECTIONS 20; GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'mysql-exporter'@'%'; GRANT SELECT ON performance_schema.* TO 'mysql-exporter'@'%'; GRANT SELECT ON sys.* TO 'mysql-exporter'@'%';

FLUSH PRIVILEGES;

Trong đó:

TrườngÝ nghĩaGiá trị mẫu
mysql-exporterUser name mysqlmysql-exporter
passwordPassword user mysqlvnpt2o26MySQL

  Lưu ý

  • Password user lấy metrics database không để kí tự @ trong chuỗi.
  • Chuỗi kết nối có thể bị cắt sai định dạng, dẫn đến lỗi kết nối tới MySQL.

2. Cấu hình Alloy

Tại đường dẫn /etc/alloy/config.alloy, chỉnh sửa cấu hình Alloy để tích hợp thu thập dữ liệu MySQL:

sudo vi /etc/alloy/config.alloy

2.1 Thu thập Metrics ứng dụng

TrườngÝ nghĩaGiá trị mẫu
urlEndpoint của dịch vụ APM trên giao diện Consolehttps://metrics-0qcs3dsvvva.apm.vnptplatform.vn/api/v1/push
AuthorizationToken của dịch vụ APM trên giao diện Consolea5130b91-ff9b-41ef-8722-9d923a574123
mysql-exporterTên user đã tạo ở mục Imysql-exporter
passwordPassword của user đã tạobXlzcWxwYXNzd29yZA==
IPIP của VM đang chạy MySQL10.168.17.30

Thay các trường trong cấu hình sau, trong đó:

logging {
  level  = "warn"
  format = "logfmt"
}
prometheus.remote_write "metrics_integrations_mysql" {
  endpoint {
    url = "<endpoint dịch vụ APM>"
    headers = {
      "Authorization" = "<token xác thực dịch vụ APM>",
    }
  }
}

prometheus.exporter.mysql "metrics_integrations_mysql" {
  data_source_name = "mysql-exporter:password@(IP:3306)/"
  disable_collectors = ["slave_status"]  //  comment khi mysql triển khai dạng slave để lấy metrics replication
}

discovery.relabel "metrics_integrations_mysql" {
  targets = prometheus.exporter.mysql.metrics_integrations_mysql.targets

  rule {
    target_label = "job"
    replacement  = "integrations/mysql"
  }

  rule {
    source_labels = ["instance"]
    regex         = "tcp\\(([^:]+):[0-9]+\\).*"
    target_label  = "instance"
    replacement   = "$1"
  }
}

prometheus.scrape "metrics_integrations_mysql" {
  targets    = discovery.relabel.metrics_integrations_mysql.output
  forward_to = [prometheus.remote_write.metrics_integrations_mysql.receiver]
  job_name   = "integrations/mysql"
  scrape_interval = "15s"
  scrape_timeout  = "10s"
}

  Lưu ý

Comment khi mysql triển khai dạng slave disable_collectors = ["slave_status"]

2.2 Thu thập Metrics ứng dụng và VM

TrườngÝ nghĩaGiá trị mẫu
urlEndpoint của dịch vụ APM trên giao diện Consolehttps://metrics-0qcs3dsvvva.apm.vnptplatform.vn/api/v1/push
AuthorizationToken của dịch vụ APM trên giao diện Consolea5130b91-ff9b-41ef-8722-9d923a574123
mysql-exporterTên user đã tạo ở mục Imysql-exporter
passwordPassword của user đã tạobXlzcWxwYXNzd29yZA==
IPIP của VM đang chạy MySQL10.168.17.30

Thay các trường trong cấu hình trên, trong đó:

logging {
  level  = "warn"
  format = "logfmt"
}
prometheus.remote_write "metrics_integrations_mysql" {
  endpoint {
    url = "<endpoint dịch vụ APM>"
    headers = {
      "Authorization" = "<token dịch vụ APM>",
    }
  }
}

prometheus.exporter.mysql "metrics_integrations_mysql" {
  data_source_name = "mysql-exporter:password@(IP:3306)/"
  disable_collectors = ["slave_status"]  //  comment khi mysql triển khai dạng slave để lấy metrics replication
}

discovery.relabel "metrics_integrations_mysql" {
  targets = prometheus.exporter.mysql.metrics_integrations_mysql.targets

  rule {
    target_label = "job"
    replacement  = "integrations/mysql"
  }

  rule {
    source_labels = ["instance"]
    regex         = "tcp\\(([^:]+):[0-9]+\\).*"
    target_label  = "instance"
    replacement   = "$1"
  }
}

prometheus.scrape "metrics_integrations_mysql" {
  targets    = discovery.relabel.metrics_integrations_mysql.output
  forward_to = [prometheus.remote_write.metrics_integrations_mysql.receiver]
  job_name   = "integrations/mysql"
  scrape_interval = "15s"
  scrape_timeout  = "10s"
}

discovery.relabel "metrics_integrations_linux" {
  targets = prometheus.exporter.unix.metrics_integrations_linux.targets

  rule {
    target_label = "instance"
    replacement  = "<IP VM>"
  }

  rule {
    target_label = "job"
    replacement = "integrations/node_exporter"
  }
}

prometheus.exporter.unix "metrics_integrations_linux" {
  disable_collectors = ["ipvs", "btrfs", "infiniband", "xfs", "zfs"]

  filesystem {
    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)$"
    mount_points_exclude = "^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+)($|/)"
    mount_timeout        = "5s"
  }

  netclass {
    ignored_devices = "^(veth.*|cali.*|[a-f0-9]{15})$"
  }

  netdev {
    device_exclude = "^(veth.*|cali.*|[a-f0-9]{15})$"
  }
}

prometheus.scrape "metrics_integrations_linux" {
  targets    = discovery.relabel.metrics_integrations_linux.output
  forward_to = [prometheus.relabel.metrics_integrations_linux.receiver]
  scrape_interval = "15s"
  scrape_timeout  = "10s"
}

prometheus.relabel "metrics_integrations_linux" {
  forward_to = [prometheus.remote_write.metrics_integrations_mysql.receiver]

  rule {
    source_labels = ["__name__"]
    regex         = "up|node_arp_entries|node_boot_time_seconds|node_context_switches_total|node_cpu_seconds_total|node_disk_io_time_seconds_total|node_disk_io_time_weighted_seconds_total|node_disk_read_bytes_total|node_disk_read_time_seconds_total|node_disk_reads_completed_total|node_disk_write_time_seconds_total|node_disk_writes_completed_total|node_disk_written_bytes_total|node_filefd_allocated|node_filefd_maximum|node_filesystem_avail_bytes|node_filesystem_device_error|node_filesystem_files|node_filesystem_files_free|node_filesystem_readonly|node_filesystem_size_bytes|node_intr_total|node_load1|node_load15|node_load5|node_md_disks|node_md_disks_required|node_memory_Active_anon_bytes|node_memory_Active_bytes|node_memory_Active_file_bytes|node_memory_AnonHugePages_bytes|node_memory_AnonPages_bytes|node_memory_Bounce_bytes|node_memory_Buffers_bytes|node_memory_Cached_bytes|node_memory_CommitLimit_bytes|node_memory_Committed_AS_bytes|node_memory_DirectMap1G_bytes|node_memory_DirectMap2M_bytes|node_memory_DirectMap4k_bytes|node_memory_Dirty_bytes|node_memory_HugePages_Free|node_memory_HugePages_Rsvd|node_memory_HugePages_Surp|node_memory_HugePages_Total|node_memory_Hugepagesize_bytes|node_memory_Inactive_anon_bytes|node_memory_Inactive_bytes|node_memory_Inactive_file_bytes|node_memory_Mapped_bytes|node_memory_MemAvailable_bytes|node_memory_MemFree_bytes|node_memory_MemTotal_bytes|node_memory_SReclaimable_bytes|node_memory_SUnreclaim_bytes|node_memory_ShmemHugePages_bytes|node_memory_ShmemPmdMapped_bytes|node_memory_Shmem_bytes|node_memory_Slab_bytes|node_memory_SwapTotal_bytes|node_memory_VmallocChunk_bytes|node_memory_VmallocTotal_bytes|node_memory_VmallocUsed_bytes|node_memory_WritebackTmp_bytes|node_memory_Writeback_bytes|node_netstat_Icmp6_InErrors|node_netstat_Icmp6_InMsgs|node_netstat_Icmp6_OutMsgs|node_netstat_Icmp_InErrors|node_netstat_Icmp_InMsgs|node_netstat_Icmp_OutMsgs|node_netstat_IpExt_InOctets|node_netstat_IpExt_OutOctets|node_netstat_TcpExt_ListenDrops|node_netstat_TcpExt_ListenOverflows|node_netstat_TcpExt_TCPSynRetrans|node_netstat_Tcp_InErrs|node_netstat_Tcp_InSegs|node_netstat_Tcp_OutRsts|node_netstat_Tcp_OutSegs|node_netstat_Tcp_RetransSegs|node_netstat_Udp6_InDatagrams|node_netstat_Udp6_InErrors|node_netstat_Udp6_NoPorts|node_netstat_Udp6_OutDatagrams|node_netstat_Udp6_RcvbufErrors|node_netstat_Udp6_SndbufErrors|node_netstat_UdpLite_InErrors|node_netstat_Udp_InDatagrams|node_netstat_Udp_InErrors|node_netstat_Udp_NoPorts|node_netstat_Udp_OutDatagrams|node_netstat_Udp_RcvbufErrors|node_netstat_Udp_SndbufErrors|node_network_carrier|node_network_info|node_network_mtu_bytes|node_network_receive_bytes_total|node_network_receive_compressed_total|node_network_receive_drop_total|node_network_receive_errs_total|node_network_receive_fifo_total|node_network_receive_multicast_total|node_network_receive_packets_total|node_network_speed_bytes|node_network_transmit_bytes_total|node_network_transmit_compressed_total|node_network_transmit_drop_total|node_network_transmit_errs_total|node_network_transmit_fifo_total|node_network_transmit_multicast_total|node_network_transmit_packets_total|node_network_transmit_queue_length|node_network_up|node_nf_conntrack_entries|node_nf_conntrack_entries_limit|node_os_info|node_sockstat_FRAG6_inuse|node_sockstat_FRAG_inuse|node_sockstat_RAW6_inuse|node_sockstat_RAW_inuse|node_sockstat_TCP6_inuse|node_sockstat_TCP_alloc|node_sockstat_TCP_inuse|node_sockstat_TCP_mem|node_sockstat_TCP_mem_bytes|node_sockstat_TCP_orphan|node_sockstat_TCP_tw|node_sockstat_UDP6_inuse|node_sockstat_UDPLITE6_inuse|node_sockstat_UDPLITE_inuse|node_sockstat_UDP_inuse|node_sockstat_UDP_mem|node_sockstat_UDP_mem_bytes|node_sockstat_sockets_used|node_softnet_dropped_total|node_softnet_processed_total|node_softnet_times_squeezed_total|node_systemd_unit_state|node_textfile_scrape_error|node_time_zone_offset_seconds|node_timex_estimated_error_seconds|node_timex_maxerror_seconds|node_timex_offset_seconds|node_timex_sync_status|node_uname_info|node_vmstat_oom_kill|node_vmstat_pgfault|node_vmstat_pgmajfault|node_vmstat_pgpgin|node_vmstat_pgpgout|node_vmstat_pswpin|node_vmstat_pswpout|process_max_fds|process_open_fds"
    action        = "keep"
  }
}

3. Cài đặt

Thực hiện lệnh sau để khởi động Alloy:

sudo systemctl status alloy 

4. Kiểm tra

4.1 Kiểm tra dịch vụ

Thực hiện lệnh sau:

sudo systemctl status alloy 

Hệ thống trả về như sau nếu thành công:

● alloy.service - Vendor-agnostic OpenTelemetry Collector distribution with programmable pipelines
    Loaded: loaded (/lib/systemd/system/alloy.service; enabled; vendor preset: enabled)
    Active: active (running) since Thu 2025-04-24 18:25:30 +07; 14h ago
      Docs: https://grafana.com/docs/alloy
   Process: 312064 ExecReload=/usr/bin/env kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
  Main PID: 4041003 (alloy)
     Tasks: 18 (limit: 9385)
    Memory: 80.3M
       CPU: 38min 6.739s
    CGroup: /system.slice/alloy.service
            └─4041003 /usr/bin/alloy run --server.http.listen-addr=0.0.0.0:30000 --storage.path=/var/lib/alloy/data /e>

Nếu không thành công, xem log Alloy:

sudo journalctl -u alloy -ex 

Sau đó chỉnh sửa cấu hình nếu cần và khởi động lại:

sudo systemctl restart alloy 

4.2 Kiểm tra tích hợp

Tham khảo hướng dẫn tích hợp dashboard, kiểm tra metrics MySQL trên giao diện Dashboard:

Một số dashboard mẫu khi tích hợp thành công: