티스토리 뷰
인프라
Grafana, Loki를 ECS 환경에서 사용하여 모니터링, 로깅, 경보 시스템 구축하기 - (3) Grafana (Data Source, Dashboard, Alert)
김도리개발자 2023. 12. 12. 16:55Grafana를 Terraform 으로 프로비저닝하기 전에 UI 에서 직접 설정을 해보자
1️⃣ Data Source
2️⃣ Dashboard
- 로그를 전부 보여주는 Dashboard
- Error 로그의 count 를 보여주는 Dashboard (Alert 만들기용)
3️⃣ Alert
Alert Rules
Contact Points
- 슬랙으로 경보를 쏴주어야 하기에 Slack Contact Point 를 만들어준다.
- 경보를 보낼 내용의 템플릿을 생성할 수 있다.
{{ define "Alert Instance Template" }}
에러 메시지 : {{ .Labels.log }}
{{ end }}
Notification Policies
Label 을 필터링하여 contact point 를 설정한다.
- default 경보는 default contact point 로 쏘게 설정
- Spring Boot 에서 발생한 로그에서 쏴야하는 경보의 경우 slack contact point 로 쏘게 설정
- job = backend 인 경우 Slack 으로 설정
4️⃣ Spring Boot 에서 ERROR 로그 설정
원하는 대로 로그를 수집하고, 이를 통해 경보를 보내려면 로그를 수집하는 API Server 인 Spring Boot 코드에서도 설정이 필요하다.
Log 라는 Label 에 에러 메시지가 잘 들어가야 그를 경보로 쏠 수 있다.
- logback-spring.xml 파일을 아래와 같이 수정해준다.
더보기
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProperty name="filePath" source="logging.file.path"/>
<property name="LOG_PATTER"
value="%d{HH:mm:ss.SSS} %-5level [File:%F] [Func:%M] [Line:%L] - %msg%n"></property>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTER}</pattern>
</encoder>
</appender>
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/warn.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/warn-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level [File:%F] [Func:%M] [Line:%L] [Message:%m]- %msg%n</pattern>
</encoder>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/error.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/error-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level [File:%F] [Func:%M] [Line:%L] [Message:%m]- %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
<logger name="com.example.demo.common" level="WARN">
<appender-ref ref="WARN_FILE"/>
</logger>
<logger name="com.example.demo.domains" level="INFO"/>
<logger name="com.example.demo.common" level="INFO"/>
<logger name="com.example.demo" level="ERROR">
<appender-ref ref="ERROR_FILE"/>
</logger>
</configuration>
log.error("HttpClientErrorException has occured. %s %s %s".formatted(exception.getMessage(), exception.getCause(), exception.getStackTrace()[0]));
- 실제로 error 로그를 쏘는 코드는 다음과 같이 작성한다.
5️⃣ 결과
6️⃣ 트러블슈팅
더보기
- level=warn caller=client.go:419 id=0 component=client host=loki:3100 msg="error sending batch, will retry" status=429 tenant= error="server returned HTTP status 429 Too Many Requests (429): Maximum active stream limit exceeded, reduce the number of active streams (reduce labels or reduce label values), or contact your Loki administrator to see if the limit can be increased, user: 'fake'”
- 테스트를 위해 00초에 한 번 로그를 쏘는 API Server 를 만들었었다.
- 로그를 주기적으로 너무 많이 쏘니까 로봇이라고 판단해버린 이런 에러가 떴다.
- failed to evaluate queries and expressions: [sse.readDataError] [A] got error: input data must be a wide series but got type long (input refid)
- 경보를 만들기 위한 대시보드는 wide series 만 가능하다.
- 경보 생성을 위한 대시보드는 rate 나 count 로 쿼리를 짜야 한다.
- ERROR 로그가 없을 때에도 설정해둔 주기에 맞춰 DatasourceNoData 경보가 슬랙으로 계속 발송되었다.
- Notification Policy 설정으로 default 경보는 default contact point 로 쏘게 하고 Spring Boot 에서 발생한 로그에서 쏴야하는 경보의 경우 slack contact point 로 쏘게 설정한다.
'인프라' 카테고리의 다른 글
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 인프라
- RDS
- Service
- CSS
- js
- ALB
- 리액트
- VPC
- 서버
- github action
- LOKI
- 로깅
- AWS
- Grafana
- ci/cd
- SG
- subnet
- javascript
- EC2
- Workflow
- springboot
- ecr
- Docker
- html
- redux
- ECS
- Hook
- Grafana Alert
- 모니터링
- react
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함