---
title: "Signoz 소개"
description: "Observability 솔루션 Signoz 소개"
url: https://insight.infograb.net/blog/2023/05/15/signoz/
source: content/blog/archive/2023-05-15-signoz.md
---

import useBaseUrl from "@docusaurus/useBaseUrl";
import Image from "../src/components/Image"
import TierLabel from "../src/components/TierLabel"
import Twitter from "../src/components/Twitter"

최근 IT 업계에서 마이크로서비스 아키텍처, 클라우드 네이티브와 같은 최신 기술 트렌드가 빠르게 채택되고 있습니다. 그러나 규모가 확장되면서 복잡해진 아키텍처에 대해 사용자들이 어려움을 겪고 있습니다.

**여러분은 마이크로서비스, 클라우드 네이티브 환경을 사용하고 계시나요? 서비스 환경에서 워크플로를 인지하고 계시나요? 문제가 발생했을 때, 이를 빠르게 감지하거나 추적하는 게 가능하신가요?**

요즘 IT 업계에서는 **observability** 개념이 주목받고 있는데요. 이는 **시스템 외부 출력의 결괏값에서 시스템 내부 상태를 얼마나 잘 추론하는지** 나타내는 척도입니다. observability를 지원하는 관련 솔루션도 시중에 여럿 있죠.

observability 솔루션은 조직에서 애플리케이션을 운영할 때, 위 질문에서 언급한 상황을 잘 대응하도록 지원합니다. 이 솔루션은 서비스 환경에서 워크플로를 인지하도록 돕고요. 서비스 운영 과정에서 문제가 생기면 이를 신속히 파악하고, 문제 원인을 추적하도록 지원하죠.
이 글에서는 observability 개념과 관련 도구인 Signoz를 알아보려고 합니다. 아울러 Signoz 기능을 활용한 observability 구현 방안을 살펴보겠습니다.

## Observability란?

observability는 **Log**, **Metric**, **Traces** 등의 시스템이 생성하는 데이터 항목을 기반으로 **시스템의 현재 상태**를 **측정**하는 기능입니다.
클라우드 네이티브 환경의 마이크로서비스 구조가 확장되면서 복잡해지는 구조를 observability로 보다 쉽게 확인할 수 있습니다.
엔지니어나 운영자는 observability에서 생성된 데이터를 사용해 시스템 동작을 잘 파악하고, 문제를 빠르게 감지할 수 있습니다. 또 애플리케이션 측정 데이터를 활용해 시스템 성능을 최적화할 수 있습니다

## SigNoz란?

기존 observability 솔루션에는 **Data dog**, **New Relic** 등이 있습니다. 아울러 유료 솔루션은 아니지만 오픈 소스 솔루션을 조합해 observability를 구현한 사례도 있습니다. SigNoz는 observability 솔루션 중 하나로 오픈 소스 형태입니다. 이는 자체 호스팅할 수 있는 환경을 제공하고 있습니다.

SigNoz 공식 문서에서는 이렇게 소개하고 있습니다.

```bash
SignNoz는 애플리케이션을 모니터링하고 문제를 해결하는 데
도움이 되는 오픈 소스 애플리케이션 성능 모니터링(APM) 도구입니다. 
SigNoz는 분산 추적을 사용하여 소프트웨어 스택에 대한 가시성을 확보합니다.
```

### 시스템 아키텍처

![signoz 아키텍처](image/2023-05/2023-05-15-signoz-01.png)

- **SigNoz Otel Collector** : 서비스 및 애플리케이션에서 telemetry 데이터를 수집합니다.
- **Clickhouse** : 오픈소스 OLAP 데이터베이스 관리 시스템입니다.
- **Query Service** : Frontend와 Clickhouse 간의 인터페이스입니다.
- **Alert Manager** : 발생하는 이벤트를 Email, Slack 등으로 전달하는 시스템입니다.
- **Frontend** : ReactJS 및 TypeScript에 내장된 사용자 인터페이스입니다.

## Why Signoz?

SigNoz가 아니라도 다른 observability 솔루션은 존재합니다.
여러 도구 중 SigNoz의 이점은 무엇일까요?

1. **단일 도구**

기능별 오픈 소스 도구들은 다양하게 존재합니다.
그동안 업계에서는 **Grafana + Prometheus**의 스택으로 수집한 메트릭을 시각화하고, 마이크로서비스 위에서 동작하는 애플리케이션의 워크플로를 확인하기 위해 **Jaeger**와 같은 분산 추적 솔루션을 사용하였습니다. 아울러 로그를 수집하고 시각화하기 위한 **ELK(Elastic Search, Log Stash, Kibana)**, **EFK(Elastic Search, Fluent Bit, Kibana)** 등의 스택을 사용해 왔습니다.

이러한 개별 도구들의 **가장 큰 문제점은 유지 관리**였습니다. 이는 솔루션 별로 다른 화면으로 존재하여 유지 관리하는데 어려움이 생깁니다.
SigNoz는 여러 기능을 하나로 통합해 단일 애플리케이션에서 메트릭을 확인하고, 문제를 추적하며, 로그를 확인할 수 있는 단일 창을 제공합니다. 이로써 앞서 설명드린 유지 관리의 어려움을 해소할 수 있습니다.

2. **Opentelemetry 및 호환성**

SigNoz는 **Opentelemetry** 표준을 사용하여 다양한 언어 및 프레임워크를 지원합니다. OpenTelemetry를 통해 수집된 메트릭, 로그 등의 데이터를 선택된 백엔드로 export 할 수 있습니다. 아키텍처에서도 설명했듯 백엔드 기능은 SigNoz가 담당합니다.
이외에 SigNoz는 기존에 많이 사용됐던 **Grafana Dashboard** 데이터를 **Import**하여 그대로 사용할 수 있습니다. 기존에 사용하던 Grafana를 마이그레이션하기 수월하며 신규 구축 시 대시보드를 구성하는 시간을 단축할 수 있습니다.

3. **자체 호스팅**

SigNoz는 Datadog, New Relic과는 다르게 자체 호스팅할 수 있는 환경을 제공합니다.

Datadog과 New Relic은 솔루션 에이전트를 인프라에 설치하여 수집된 데이터를 중앙 서버에 보내는 Saas 형태의 호스팅으로 서비스를 제공합니다. 이는 로그 및 메트릭 정보를 외부로 노출할 수 없는 사용자에게는 부담스러운 환경이었습니다. 그러나 SigNoz는 자체 호스팅을 통하여 Private한 환경에서도 무료로 구축하여 사용할 수 있습니다.

## SigNoz 기능

SigNoz의 기능에서 **Services, Traces, Logs, DashBoards, Alerts** 5가지 기능을 소개해 드리겠습니다.

### Services

![signoz Services](image/2023-05/2023-05-15-signoz-02.png)

Services에서는 애플리케이션 메트릭 정보를 확인할 수 있습니다.

SigNoz는 기본적으로 **signoz-otel-collector**를 통해 각 애플리케이션의 데이터를 수집하여 제공합니다.

각 애플리케이션의 정보를 수집하기 위해 [언어/프레임워크별 설정](https://signoz.io/docs/instrumentation/)을 사전에 진행하여야 합니다.

제공하는 애플리케이션 메트릭 정보는 다음과 같습니다

- **P99 latency(in ms)** : 애플리케이션이 가장 빠른 99%의 요청을 각각 처리하는 데 소비하는 시간입니다. 예를 들어 대기 시간 값이 `P99 760ms`이면 **'요청의 99%는 760ms와 같거나 더 빠른 응답이 가능하다'**는 의미입니다.
- **Error Rate(% of total)** : 실패한 request의 백분율, 총 요청에 대한 오류 요청의 비율입니다.
- **Operations Per Second** : 애플리케이션이 초당 처리하는 request 수입니다.

각 지표를 통해 시스템의 성능, 처리 능력 측정이 수월해지고 Error rate를 기반으로 오류 원인을 감지하고 해결할 수 있습니다.

실제 각 애플리케이션의 상세 페이지를 들어가 보면 다음과 같은 탭으로 구성된 대시보드를 확인할 수 있습니다.

- **Application Metrics**
- **External Calls**
- **Database Calls**

![signoz Services2](image/2023-05/2023-05-15-signoz-03.png)

### Traces

Traces 항목에서는 앞서 Services에서 측정된 애플리케이션의 데이터를 기반으로 **분산 추적 데이터** 및 **일련의 Span**을 구성합니다. 각각의 Span은 시스템에서 발생하는 작업 일부분을 나타내며, Span 간의 관계를 통해서 요청의 전체적인 흐름을 파악할 수 있습니다.

분산 추적의 단일 추적은 **‘범위’**라고 하는 일련의 태그가 지정된 시간 간격으로 구성됩니다. Span은 그 안에서 사용자 요청 및 트랜잭션을 완료하는 작업의 논리적 단위입니다.

![signoz Traces](image/2023-05/2023-05-15-signoz-04.png)

하나의 요청을 선택하면 해당 Trace와 관련된 범위에 데이터를 [flame graph](https://www.brendangregg.com/flamegraphs.html) 형태로 출력합니다.

1. **Trace ID**: 페이지 상단에 SignNoz는 현재 선택된 추적의 ID를 표시합니다.
2. **Time**: 선택한 Trace의 시작 시각과 기간을 표시합니다.
3. **Focus**: 특정 Span을 Focus하여 해당 Span 정보만을 출력합니다.
4. **Main Content Area**: 모든 Span을 트리 구조로 표시합니다. 트리의 개별 노드를 확장하거나 축소하여 하위 노드를 표시하거나 숨길 수 있습니다. SigNoz는 각 노드에 하위 노드의 수를 표시합니다.
5. **Span Details**: 페이지 우측에 선택한 Span의 상세 정보를 출력합니다.

![signoz Traces2](image/2023-05/2023-05-15-signoz-05.png)

### Logs

SigNoz는 **Open Telemetry**를 통해 수집된 데이터를 **Clickhouse**에 저장하기 위해 **OTLP** 형식으로 데이터를 처리하고 전송합니다. Signoz Opentelemetry-collector가 수신하는 방식은 다음과 같습니다.

- **[OTLP Receiver](https://github.com/open-telemetry/opentelemetry-collector/blob/main/receiver/otlpreceiver/README.md) -** 이 Receiver는 지정된 포트에서 OTLP 프로토콜을 통해 로그를 받습니다. OTEL SDK를 사용하는 모든 라이브러리는 이 프로토콜에 로그를 전달할 수 있습니다. 이 프로토콜은 OTEL 수집기가 다른 OTEL 수집기로 로그를 전달해야 할 때도 사용됩니다.
- **[Filelog Receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/filelogreceiver) -** 이 Receiver는 로그가 포함된 파일을 추적하고 분석할 수 있습니다.
- **[Fluent Forward Receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/fluentforwardreceiver) -** 이 Receiver는 Fluent Forward Protocol을 통해 이벤트를 수락하는 TCP 서버를 실행합니다. FluentD 및 FluentBit는 이 수신기에 로그를 전달할 수 있습니다.
- **[TCP 수신기](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/tcplogreceiver) -** 이 Receiver는 로그를 수신할 수 있는 TCP 서버를 실행합니다.
- **[UDP 수신기](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/udplogreceiver) -** 이 Receiver는 로그를 수신할 수 있는 UDP 서버를 실행합니다.
- **[Syslog 수신기](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/syslogreceiver) -** 이 Receiver는 TCP 및 UDP를 통해 수신된 syslog를 구문 분석합니다.

**필드**

생성되는 로그들의 필드가 로그 대시보드 좌측에 출력됩니다. 이때 원하는 필드를 선택하여 추가하면, 선택한 필드의 로그들이 출력되어 나타납니다.

**필터링 검색**

페이지 상단 “**Search Filter**”를 선택하여 로그 대시보드 좌측에서 추가했던 필드를 기반으로 해당 필드에서 원하는 데이터를 검색하여 로그를 출력할 수 있습니다.

![signoz Log](image/2023-05/2023-05-15-signoz-06.png)

### Dashboard

수집된 메트릭 정보를 바탕으로 대시보드를 생성하고 보여줍니다.

대시보드 및 패널을 설정할 수 있고 **Query**에 해당하는 메트릭이 존재하면 출력합니다.

현재는 Beta 버전으로 적용되었지만 **v0.11.3** 버전에서 **Grafana의 대시보드를 Import** 할 수 있는 기능이 추가되었습니다. 대시보드가 추가된 이후 **PromQL**에 일치하는 데이터가 있으면 이를 출력합니다.

![signoz Dashboard](image/2023-05/2023-05-15-signoz-07.png)

### Alert

Signoz에서는 쿼리를 작성하여 Alert를 합니다. 쿼리는 다음 3가지의 규칙으로 작성됩니다.

1. **Query Builder** : 드롭다운에서 메트릭을 선택하여 알림을 작성하는 DIY 방식입니다. 대시보드에서 옵션을 선택하여 조건별로 필터 및 그룹화를 설정할 수도 있습니다.
2. **PromQL** : [Prometheus 쿼리 언어를](https://prometheus.io/docs/prometheus/latest/querying/basics/) 사용하여 정기적인 시간 간격으로 평가될 경고에 대한 표현식을 작성할 수 있습니다. Prometheus에서 알림을 설정했다면 이 방법이 매우 익숙할 것입니다.
3. **Clickhouse Queries** : SigNoz 데이터 모델 및 형식을 준수하는 Clickhouse 쿼리를 작성할 수 있습니다. 쿼리 결과는 경고 임계 조건을 평가하는 데 사용됩니다. 또한 쿼리 결과를 사용하여 레이블 및 주석을 생성할 수 있습니다.

Query를 작성하기 이전에 Alert를 전송할 채널을 정의하여야 합니다.

**“Settings - Alert Channels - New Alert Channel”** 을 통해 신규로 추가될 Alert 채널을 정의합니다.

Slack의 경우 [Incoming Hook 설정](https://api.slack.com/messaging/webhooks)을 활성화하고, 생성된 Webhook URL을 해당 탭에 설정하면 됩니다.

![signoz Alert](image/2023-05/2023-05-15-signoz-08.png)

정상적으로 Hook이 연결되었는지 확인하기 위해 하단 **“Test”** 버튼을 클릭하면 Webhook URL에 설정된 Slack 채널에서 알림을 받아볼 수 있습니다.

![signoz Alert2](image/2023-05/2023-05-15-signoz-09.png)

## 맺음말

지금까지 observability와 SigNoz를 알아보았습니다. SigNoz를 도입하면 시스템의 observability를 간편하게 적용할 수 있습니다. SigNoz를 도입하면 여러 관리 포인트의 콘텍스트 스위칭 부담을 줄일 수 있습니다. 이는 실제 시스템을 더 잘 파악하고 시스템을 최적화하는 데 많은 도움이 될 것입니다.

::cta::

## 참고사이트

[Signoz 공식 문서](https://signoz.io/docs/)

[Signoz Github](https://github.com/SigNoz/signoz)

::button::[우리 시스템에 맞는 옵저버빌리티 체계를 갖추고 싶으신가요? DevOps 전문가, 인포그랩과 상담하세요!](https://insight.infograb.net/contact/)::
