Kinesis Firehose - Grafana agent로 연결

Alli_Eunbi·2023년 8월 15일
1
post-thumbnail

kinesis로 전송하는 로그 데이터들을 grafana & loki로 확인하고 싶다면 Grafana Flow mode를 활용하면 됩니다.

Grafana Agent란?

Grafana Agent는 Grafana Labs에서 개발한 오픈 소스 소프트웨어입니다. Grafana Agent는 Prometheus와 함께 작동하여 서버와 애플리케이션의 메트릭 및 로그 데이터를 수집하고 처리하는 역할을 합니다.

Terraform에서 영감을 받았으며 Go언어로 제작되었습니다.

  • Terraform이란?

    Terraform은 HashiCorp사가 만든 오픈 소스 "코드형 인프라" 툴입니다.

    선언적인 코딩 툴인 Terraform은 개발자가 HCL(HashiCorp Configuration Language)이라고 불리는 상위 레벨 구성 언어를 사용하여 애플리케이션 실행을 위해 원하는 "최종 상태" 클라우드 또는 온프레미스 인프라를 기술하도록 합니다. 그런 다음 해당 최종 상태에 도달하기 위한 계획을 생성하고 인프라를 프로비저닝하기 위한 계획을 실행합니다.

    Terraform은 현재 공급되는 가장 인기 있는 인프라 자동화 툴 중 하나이며, 이는 단순 구문을 사용하여 여러 클라우드 및 온프레미스 데이터 센터에서 인프라를 프로비저닝하고 구성 변경에 대한 대응으로 인프라를 안전하고 효율적으로 다시 프로비저닝할 수 있기 때문입니다.

  • 코드형 인프라(IaC)란?

    Terraform의 장점을 보다 잘 이해하기 위해 코드형 인프라(IaC)의 장점을 먼저 이해하는 것이 도움이 됩니다. IaC를 통해 개발자는 자동화되고 신속하며 반복 가능한 프로비져닝을 제공하는 방식으로 인프라를 코딩할 수 있습니다. IaC는 버전 관리, 지속적 통합지속적 배포 등 Agile 및 DevOps 실무의 주요 구성요소입니다.

    코드형 인프라는 다음과 같은 도움을 줄 수 있습니다.

    • 속도 향상: 자원을 배포 및/또는 연결해야 하는 경우 인터페이스의 수동 탐색보다 자동화가 더 빠릅니다.

    • 안정성 향상: 인프라의 규모가 클 경우, 잘못된 순서로 자원을 잘못 구성하거나 서비스를 프로비저닝하기 쉽습니다. IaC를 사용하면 자원은 항상 프로비저닝되고 선언된 대로 구성됩니다.

    • 구성 드리프트 방지: 구성 드리프트(configuration drift)는 환경을 프로비저닝한 구성이 더 이상 실제 환경과 일치하지 않는 경우 발생합니다. (아래에서 ‘변경 불가능 인프라’를 참조하세요.)

    • 실험, 테스트 및 최적화 지원: 코드형 인프라를 사용하면 새 인프라를 더 쉽고 빠르게 프로비저닝할 수 있기 때문에 많은 시간과 자원을 투자하지 않고도 실험적 변경 사항을 적용하고 테스트할 수 있습니다. 결과가 마음에 든다면 프로덕션을 위해 새 인프라를 신속하게 확장할 수 있습니다.



Static Mode 와 Flow Mode의 차이

Static Mode

Static mode에서 Grafana Agent는 제일 성숙한 버전의 grafana agent이며, 정적인 구성 파일(config.yaml)을 사용하여 데이터를 수집하고 전송합니다. 구성 파일에는 정의된 데이터 소스의 정보와 수집 주기 등이 포함됩니다. 정적인 구성은 Agent가 정기적으로 데이터를 수집하고 전송하도록 설정하는 데 사용됩니다. 예를 들어, 로그 파일의 데이터를 주기적으로 수집하여 Prometheus 또는 Loki와 같은 데이터베이스로 전송할 수 있습니다.

(혹시라도 static mode를 사용하신다면 아래 에러 발생시 docker-compose 설정 변경해주세요. 제가 docker-compose로 띄우다가 걸렸던 에러입니다..)

Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/bin/agent": stat /bin/agent: no such file or directory: unknown
agent:
  platform: linux/amd64
  image: grafana/agent:latest
  volumes:
       - ./agent/config.yaml:/etc/agent-config/agent.yaml
       - ./agent/config.river:/etc/grafana-agent/config.river
  entrypoint:
    #!!!!!!! 아래와 같이 /bin/grafana-agent로 설정! 공식 깃허브 docker 예시 믿지마세요
       - /bin/grafana-agent
       - -server.http.address=0.0.0.0:12345
       - -config.file=/etc/agent-config/agent.yaml
       - -metrics.wal-directory=/tmp/agent/wal
       - -enable-features=integrations-next
       - -config.expand-env
       - -config.enable-read-api
 environment:
       HOSTNAME: agent
       AGENT_MODE: flow
       LOKI_HOST: loki:3100
     ports:
       - "12345:12345"

Flow Mode

Flow mode에서 Grafana Agent는 대화형(config.river)으로 데이터를 수집하고 전송하는 방식입니다. Flow mode는 component-based로 사용자의 요구에 적응하는 기능에 중점을 뒀습니다. 여기서, component는 grafana agent flow의 기능 정의를 말합니다.

현재, kinesis firehose의 데이터 스트리밍을 지원하는 grafana agent는 flow 모드 입니다.


Config.river 설정

config.river 란?

Grafana Agent가 수집하는 데이터의 수집 대상과 관련된 구성을 담당합니다. 이 구성은 Grafana Agent가 Prometheus와 같은 데이터소스에서 수집한 데이터를 어디에 보낼지, 어떤 형식으로 보낼지 등을 정의합니다. config.river 설정을 통해 데이터를 다양한 대상으로 전달할 수 있습니다.

config.river는 다음과 같은 섹션으로 구성됩니다:

  1. source: 데이터 소스를 정의하는 섹션으로, 데이터 소스에 연결하는 방법과 관련된 정보를 제공합니다.
  2. target: 데이터를 보낼 대상을 정의하는 섹션으로, 수집한 데이터를 어디로 전송할지 설정합니다. 대상으로는 다양한 데이터베이스, 스토리지 시스템, 메시징 시스템 등이 포함될 수 있습니다.
  3. transforms: 데이터 변환을 정의하는 섹션으로, 수집한 데이터를 필터링, 재구성 또는 다른 형식으로 변환하는 방법을 설정합니다.

!! 주의: 공식문서에는 loki.{method} “{label}”{} 설정하면 라벨이 알아서 설정될것 이라고 되어 있지만 실제로는 되지 않음.

config.river 설정

!! 주의: label 설정 시 카멜케이스 혹은 스네이크 케이스 사용, - 사용 금지
실 사용시 아래 주석은 다 삭제 이후 사용해야 에러 발생하지 않습니다.
!!! 아래 설정만 잘 되면 grafana-agent는 /awsfirehose/api/v1/push 라는 앤드포인트를 자동 생성하고, 해당 엔드포인트로 온 요청을 처리합니다.

# loki에 write 하는 component
loki.write "local" {
    endpoint {
        url = "http://loki:3100/loki/api/v1/push"
    }
}

# kinesis firehose의 데이터 스트리밍 post 요청을 처리할 component
# 엔드포인트는 /awsfirehose/api/v1/push로 온 요청을 처리함.
# address를 0.0.0.0 으로 해야 모든 address에서 오는 요청을 받을 수 있음.
# 8080 포트 서버로 생성되며 해당 포트로 모든 kinesis 데이터 스트리밍을 받음.
# 요청이 들어오면 아래 forward_to의 loki.process 컴포넌트로 넘겨줌
loki.source.awsfirehose "loki_fh_receiver" {
    http {
        listen_address = "0.0.0.0"
        listen_port = 8080
    }
    forward_to = [
	    loki.process.kinesis_firehose.receiver,
    ]
}

# loki.process는 label 설정을 할 수 있음
loki.process "kinesis_firehose"{

# 아래는 json으로 넘어온 log 값에서 json value 값을 저장
# 예시) {"time":"2023-01-18T17:08:41+00:00", "app":"foo", "level":"WARN"}
# 위의 값에서 appname은 app의 value인 foo로 저장 level은 위의 level의 value WARN 값으로 저장
  stage.json {
      expressions = { 
         "appname" = "app",
         "level" = "level",
     }
  }

# 위에서 넘어온 값들을 label로 설정
  stage.labels {
     values = {
       "spring_app" = "appname",
       "message" = "msg",
       "level" = "level",
       "host" = "hostName", 
     }
  }

# 고정 label 값 설정
  stage.static_labels {
    values = {
      job = "kinesis_firehose",
    }
  }
  
# loki에 저장하기 위에 맨 위의 loki.write 컴포넌트로 넘김
  forward_to = [
     loki.write.local.receiver,
  ]
}

Docker-compose 설정

grafana와 loki는 이미 docker-compose 설정이 되어있다는 가정 아래, agent는 아래와 같이 설정하면 됩니다.

version: "3"
networks:
  grafana:
  loki:

services:
  agent:
    platform: linux/amd64
    image: grafana/agent:latest
    # 아래 config.river가 연결한 component에 관한 설정
    volumes:
      - ./agent/config.river:/etc/agent/config.river
    ports:
     # 12345 포트는 기본 agent 포트
     # 8080 포트는 agent에서 kinesis firehose 수신할 서버 포트
      - 12345:12345
      - 8080:8080
    command: run --server.http.listen-addr=0.0.0.0:12345 /etc/agent/config.river
    environment:
     # AGENT_MODE를 flow로 설정해야 flow모드로 실행 됨
      - AGENT_MODE=flow
      - HOSTNAME=agent
    networks:
      - loki
      - grafana

Kinesis Firehose Data streaming 설정

kinesis data firehose 설정은 아래만 맞춰주면 됩니다!

검정색 칠해져 있는 부분을 grafana-agent 컨테이너의 url 주소로 설정하고, 해당 주소 뒤에 /awsfirehose/api/v1/push 만 붙여주면 됩니다.

profile
BACKEND

0개의 댓글