Skip to content

[CHORE#96] monitoring system 설정 추가#97

Merged
ijnuegnaj merged 14 commits intodevelopfrom
chore/#96-monitoring-system
Feb 11, 2026
Merged

[CHORE#96] monitoring system 설정 추가#97
ijnuegnaj merged 14 commits intodevelopfrom
chore/#96-monitoring-system

Conversation

@ijnuegnaj
Copy link
Copy Markdown
Contributor

@ijnuegnaj ijnuegnaj commented Feb 9, 2026

📌 관련 이슈

✨ PR 세부 내용

image image image

loki+alloy 까지 추가 연동했습니다

✅ 체크리스트

  • 빌드 및 테스트 통과
  • 주요 기능 정상 동작

@ijnuegnaj ijnuegnaj self-assigned this Feb 9, 2026
@ijnuegnaj ijnuegnaj added the 🔧 chore 코드/로직 영향 없는 프로젝트 관리 작업, 환경설정, 의존성 관련 작업을 합니다. label Feb 9, 2026
@devgeon
Copy link
Copy Markdown
Contributor

devgeon commented Feb 9, 2026

모니터링 용도라면 포트를 직접 여는 대신 ssh 포트포워딩으로 접속해도 좋을 것 같아요.

@AlphaBs
Copy link
Copy Markdown
Contributor

AlphaBs commented Feb 9, 2026

  • https://github.com/NOVA-9th/nova-be/blob/develop/docker-compose.yml 에도 grafana prometheus 추가를 해야 CICD 할때 같이 실행이됩니다.
  • 9090 포트는 외부 노출 할 필요가 없어서 숨겨도 좋을거같습니다. 3000 그라파나는 외부노출하되 admin 계정 비밀번호만 어려운걸로 잘 설정해서 공유하면 될거같아요.

@ijnuegnaj
Copy link
Copy Markdown
Contributor Author

  • https://github.com/NOVA-9th/nova-be/blob/develop/docker-compose.yml 에도 grafana prometheus 추가를 해야 CICD 할때 같이 실행이됩니다.

  • 9090 포트는 외부 노출 할 필요가 없어서 숨겨도 좋을거같습니다. 3000 그라파나는 외부노출하되 admin 계정 비밀번호만 어려운걸로 잘 설정해서 공유하면 될거같아요.

ec2 서버에서 docker-compose.yml을 수정하다보니 pr에 반영이 안 된것같습니다. 로컬 서버에서도 docker-compose.yml 수정해서 pr 다시올리겠습니다

Copy link
Copy Markdown
Contributor

@AlphaBs AlphaBs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다~ 추가작업으로 요런 작업도 해보면 좋을거같아요

  • promtail 대신 alloy 사용 (promtail 은 지원 종료되었습니다!)
  • logback-spring 은 spring 이 loki 로 로그를 보내는 방식인데, 반대로 alloy 가 docker 로그를 수집하는 방식으로 변경하여 spring, nginx, 등등 docker 위에 돌아가는 모든 컨테이너의 로그도 함께 수집
  • alloy 에서 unix exporter 추가하여 서버의 CPU, 메모리 사용량도 모니터링

@ijnuegnaj
Copy link
Copy Markdown
Contributor Author

  • promtail 대신 alloy 사용 (promtail 은 지원 종료되었습니다!)
  • logback-spring 은 spring 이 loki 로 로그를 보내는 방식인데, 반대로 alloy 가 docker 로그를 수집하는 방식으로 변경하여 spring, nginx, 등등 docker 위에 돌아가는 모든 컨테이너의 로그도 함께 수집
  • alloy 에서 unix exporter 추가하여 서버의 CPU, 메모리 사용량도 모니터링

헉 이걸 제가 이제 봤네요..! promtail 삭제후 alloy로 소스코드 변경했습니다! 피드백 감사합니다

@AlphaBs
Copy link
Copy Markdown
Contributor

AlphaBs commented Feb 10, 2026

참고용으로 제 서버에서 사용중인 설정파일 공유해드립니다!

docker-compose.yml

services:
  loki:
    user: "1000"
    image: grafana/loki:latest
    container_name: loki
    restart: unless-stopped
    command: -config.file=/etc/loki/local-config.yaml
    volumes:
      - ./loki.yml:/etc/loki/local-config.yaml
      - ./loki:/loki
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "5"

  prometheus:
    user: "1000"
    image: prom/prometheus
    container_name: prometheus
    restart: unless-stopped
    command: "--config.file /etc/prometheus/prometheus.yml --web.enable-remote-write-receiver"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus:/prometheus
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "5"

  alloy:
    image: grafana/alloy:latest
    container_name: alloy
    restart: unless-stopped
    volumes:
      - ./alloy:/etc/alloy/config.alloy
      - /var/run/docker.sock:/var/run/docker.sock:ro
    command: run --server.http.listen-addr=0.0.0.0:12345 --storage.path=/var/lib/alloy/data /etc/alloy/config.alloy --disable-reporting
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "5"

alloy

logging {
  level = "info"
  format = "logfmt"
}

discovery.docker "logs_integrations_docker" {
  host = "unix:///var/run/docker.sock"
  refresh_interval = "5s"
}

discovery.relabel "logs_integrations_docker" {
  targets = []

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

  rule {
    target_label = "instance"
    replacement = constants.hostname
  }

  rule {
    source_labels = ["__meta_docker_container_name"]
    regex = "/(.*)"
    target_label = "container"
  }

  rule {
    source_labels = ["__meta_docker_container_log_stream"]
    target_label = "stream"
  }
}

loki.source.docker "logs_integrations_docker" {
  host = "unix:///var/run/docker.sock"
  targets = discovery.docker.logs_integrations_docker.targets
  forward_to = [loki.process.nginx_process.receiver]
  relabel_rules = discovery.relabel.logs_integrations_docker.rules
  refresh_interval = "5s"
}

loki.process "nginx_process" {
  forward_to = [loki.write.logs_remote.receiver]
  stage.match {
    selector = "{service_name=\"nginx\"}"
    stage.logfmt {
      mapping = {
        remote_addr            = "remote_addr",
        connecting_ip          = "connecting_ip",
        request                = "request",
        status                 = "status",
        request_time           = "request_time",
        upstream_response_time = "upstream_response_time",
      }
    }
    stage.labels {
      values = {
        type                   = "",
        remote_addr            = "",
        connecting_ip          = "",
        request                = "",
        status                 = "",
        request_time           = "",
        upstream_response_time = "",
      }
    }
  }
}

loki.write "logs_remote" {
  endpoint {
    url = "http://loki:3100/loki/api/v1/push"
  }
}

prometheus.exporter.process "local_process" {
  track_children = false

  matcher {
    comm = ["alloy"]
  }
}

prometheus.exporter.unix "local_system" {

}

prometheus.scrape "scrape_metrics" {
  targets = array.concat(
    prometheus.exporter.unix.local_system.targets,
    prometheus.exporter.process.local_process.targets,
  )
  forward_to = [prometheus.relabel.filter_metrics.receiver]
  scrape_interval = "10s"
}

prometheus.relabel "filter_metrics" {
  rule {
    action = "drop"
    source_labels = ["env"]
    regex = "dev"
  }

  forward_to = [prometheus.remote_write.metrics_remote.receiver]
}

prometheus.remote_write "metrics_remote" {
  endpoint {
    url = "http://prometheus:9090/api/v1/write"
  }
}

loki.yml

auth_enabled: false

server:
  http_listen_port: 3100

common:
  instance_addr: 127.0.0.1
  path_prefix: /loki
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2020-05-15
      store: tsdb
      object_store: s3
      schema: v13
      index:
        prefix: index_
        period: 24h

storage_config:
  tsdb_shipper:
    active_index_directory: /loki/index
    cache_location: /loki/index_cache
  aws:
    s3: s3://ap-northeast-2/snowfrost-loki
    access_key_id: 
    secret_access_key: 

compactor:
  working_directory: /loki/retention
  compaction_interval: 1h
  retention_enabled: true
  retention_delete_delay: 2h
  retention_delete_worker_count: 10
  delete_request_store: aws

limits_config:
  retention_period: 720h

ruler:
  alertmanager_url: http://localhost:9093

@AlphaBs
Copy link
Copy Markdown
Contributor

AlphaBs commented Feb 10, 2026

  • CI/CD 스크립트 수정하여 alloy.yml, prometheus.yml, loki.yml 같은 파일이 서버에 자동으로 갱신되도록 만들기, docker-compose.yml 가 이미 자동으로 갱신되고 있으니 여기에 파일 몇개만 더 추가하면 될거에요.
  • grafana, loki, prometheus 에 user: "1000" 추가하기 참고

https://github.com/NOVA-9th/nova-be/actions/workflows/cd.yml
여기서 Run workflow - branch - chore/#96-monitoring 선택 - Run workflow
돌리면 머지하지 않아도 현재 PR 을 서버에 바로 배포할 수 있어요. 배포 후에 스프링 로그랑 매트릭 잘 오는지 테스트해보시면 되겠습니다!

@ijnuegnaj ijnuegnaj changed the title [CHORE] monitoring system 설정 추가 [CHORE#96] monitoring system 설정 추가 Feb 11, 2026
@ijnuegnaj ijnuegnaj merged commit 9ff84f4 into develop Feb 11, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔧 chore 코드/로직 영향 없는 프로젝트 관리 작업, 환경설정, 의존성 관련 작업을 합니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants