Open5GS 5GCとUERANSIM UE/RANでNFのメトリックをPrometheusでモニタリング

本記事は、Open5GSとUERANSIMを使用して、C-PlaneのNF(AMF,SMF)のメトリックをPrometheusでモニタリングする場合の簡単な設定について説明します。これにより、5G通信におけるAMFセッション数やアクティブなGTPv1 PDUコンテキスト等の稼働状況をモニタリングすることができます。
なお、5GCのコア網に登場する各NF(Network Function)の役割やインターフェースについて概ね知っていることを期待して書いており、これらの説明は省略します。

---

## 目次

- [Open5GS 5GCのシミュレーション携帯網の概要](#open5gs-5gcのシミュレーション携帯網の概要)
- [Open5GS 5GC C-Planeの設定ファイルの追加の変更点](#open5gs-5gc-c-planeの設定ファイルの追加の変更点)
- [Prometheusを有効にしたOpen5GSのビルド](#prometheusを有効にしたopen5gsのビルド)
- [Prometheusを実行](#prometheusを実行)
    - [Prometheus DashboardへのWebアクセス](#prometheus-dashboardへのwebアクセス)
    - [Open5GS AMFのメトリック](#open5gs-amfのメトリック)
    - [Open5GS SMFのメトリック](#open5gs-smfのメトリック)
- [Grafanaを実行](#grafanaを実行)
    - [Grafana DashboardへのWebアクセス](#grafana-dashboardへのwebアクセス)
    - [Grafanaで使用するPrometheus data source](#grafanaで使用するprometheus-data-source)
    - [Grafanaでメトリックを可視化する設定例](#grafanaでメトリックを可視化する設定例)
- [最後に](#最後に)
- [主な変更履歴](#主な変更履歴)

---

## Open5GS 5GCのシミュレーション携帯網の概要

これは、以下の構成例にPrometheusによるNFのメトリックのモニタリングを適用した際の追加の設定例です。

- [Open5GS 5GC & UERANSIM UE / RAN Sample Configuration - Select UPF based on S-NSSAI](https://github.com/s5uishida/open5gs_5gc_ueransim_snssai_upf_sample_config)

以下に構成を示します。なお、メトリックに関係しないNFについては、図から省略しています。

<img width="800" alt="network-overview.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457466/7b830550-303b-790d-62c1-7546ddd99c70.png">

5GCとUE/RANに使用しているOSSは以下の通りです。PrometheusとGrafana(可視化サーバ)には、Dockerを使用しています。

- 5GC - Open5GS v2.4.9 - https://github.com/open5gs/open5gs
- UE / RAN - UERANSIM v3.2.6 - https://github.com/aligungr/UERANSIM

モニタリングしているNFのIPアドレスとポートは以下の通りです。

| NF | IP address | port | Prometheus job_name |
| --- | --- | --- | --- |
| AMF | 192.168.0.111 | 9090/tcp | open5gs-amfd |
| SMF1 | 192.168.0.112 | 9090/tcp | open5gs-smfd1 |
| SMF2 | 192.168.0.113 | 9090/tcp | open5gs-smfd2 |

PrometheusとGrafana-OSSの公開しているIPアドレスとポートは以下の通りです。

| Server | IP address | port |
| --- | --- | --- |
| Prometheus |  192.168.0.111 | 9091/tcp |
| Grafana-OSS |  192.168.0.111 | 3000/tcp |

## Open5GS 5GC C-Planeの設定ファイルの追加の変更点

この場合、次の構成に対して、PrometheusによるNFのメトリックのモニタリング用に更なる変更を行います。

- [Open5GS 5GC & UERANSIM UE / RAN Sample Configuration - Select UPF based on S-NSSAI](https://github.com/s5uishida/open5gs_5gc_ueransim_snssai_upf_sample_config)

ここでは、追加で設定する内容について説明します。モニタリングに際して、C-Planeの各NFの以下の設定ファイルを編集します。

- `open5gs/install/etc/open5gs/amf.yaml`

```
...
metrics:
    addr: 192.168.0.111
    port: 9090
```

- `open5gs/install/etc/open5gs/smf1.yaml`

```
...
metrics:
    addr: 192.168.0.112
    port: 9090
```

- `open5gs/install/etc/open5gs/smf2.yaml`

```
...
metrics:
    addr: 192.168.0.113
    port: 9090
```

## Prometheusを有効にしたOpen5GSのビルド

Prometheusを有効にしたOpen5GSのビルド方法は以下を参照して下さい。

- https://open5gs.org/open5gs/docs/guide/02-building-open5gs-from-sources/
- https://open5gs.org/open5gs/docs/tutorial/04-metrics-prometheus/

追加で、`cmake`をインストールします。

```
apt update
apt install cmake
```

DockerでPrometheusを実行するために、以下をインストールします。

- [docker-ce](https://docs.docker.com/install/linux/docker-ce/ubuntu)

**ここで、Ubuntu 20.04でビルドする場合の注意点を少し説明します。**

**1. 以下の通り、ビルド手順を少し変更します。**

```
cd open5gs
meson build --prefix=`pwd`/install
ninja -C build
```

上記を以下の通りに変更します。

```
cd open5gs
meson build --prefix=`pwd`/install && meson configure -Dmetrics_impl=prometheus build
ln -s `pwd`/subprojects/ `pwd`/../subprojects
ninja -C build
```

**2. ビルドとインストールの後、共有ライブラリ`libcm_prom.so`のリンクが以下のNFで見つからない場合、次の操作を行います。**

```
open5gs-amfd
open5gs-smfd
```

`libcm_prom.so`をリンクするために、次の操作を行います。

```
cd open5gs
cp -p install/lib/libcm_prom.so install/lib/x86_64-linux-gnu/
```

これでもリンクが見つからない場合、次の操作を行います。

```
cd open5gs
echo `pwd`/install/lib/x86_64-linux-gnu >> /etc/ld.so.conf.d/open5gs.conf
ldconfig
```

## Prometheusを実行

Open5GSとPrometheusの連携は、以下を参照して下さい。

- https://open5gs.org/open5gs/docs/tutorial/04-metrics-prometheus/

### Prometheus DashboardへのWebアクセス

最初に、以下の`prometheus.yml`を作成します。

```yaml
global:
  scrape_interval: 10s

scrape_configs:
  - job_name: open5gs-amfd
    static_configs:
      - targets: ["192.168.0.111:9090"]
  - job_name: open5gs-smfd1
    static_configs:
      - targets: ["192.168.0.112:9090"]
  - job_name: open5gs-smfd2
    static_configs:
      - targets: ["192.168.0.113:9090"]
```

Open5GSを起動した後、以下の通りにPrometheusを実行します。

```
docker run -d -p 9091:9090 -v `pwd`/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
```

これで、ブラウザから以下のURLにアクセスできるようになります。

```
http://192.168.0.111:9091/
```

<img width="800" alt="network-overview.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457466/9b2b3322-f8cd-48c3-e38c-348e5f53e136.png">

モニタリング対象のNFの一覧は以下の通りです。

<img width="800" alt="network-overview.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457466/0b5c8a4b-17a9-fcd6-3a31-cd7ae216324c.png">

### Open5GS AMFのメトリック

job_name=**open5gs-amfd**のEndpoint linkを辿ると、以下のメトリックが表示されます。

```sh
# HELP ran_ue RAN UEs
# TYPE ran_ue gauge
ran_ue 0

# HELP amf_session AMF Sessions
# TYPE amf_session gauge
amf_session 0

# HELP gnb gNodeBs
# TYPE gnb gauge
gnb 0

# HELP process_max_fds Maximum number of open file descriptors.
# TYPE process_max_fds gauge
process_max_fds 1024

# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes.
# TYPE process_virtual_memory_max_bytes gauge
process_virtual_memory_max_bytes -1

# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
# TYPE process_cpu_seconds_total gauge
process_cpu_seconds_total 3

# HELP process_virtual_memory_bytes Virtual memory size in bytes.
# TYPE process_virtual_memory_bytes gauge
process_virtual_memory_bytes 152248320

# HELP process_resident_memory_bytes Resident memory size in bytes.
# TYPE process_resident_memory_bytes gauge
process_resident_memory_bytes 19255296

# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 515230

# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
process_open_fds 24
```

### Open5GS SMFのメトリック

job_name=**open5gs-smfd1**のEndpoint linkを辿ると、以下のメトリックが表示されます。

```sh
# HELP gn_rx_createpdpcontextreq Received GTPv1C CreatePDPContextRequest messages
# TYPE gn_rx_createpdpcontextreq counter
gn_rx_createpdpcontextreq 0

# HELP gn_rx_deletepdpcontextreq Received GTPv1C DeletePDPContextRequest messages
# TYPE gn_rx_deletepdpcontextreq counter
gn_rx_deletepdpcontextreq 0

# HELP gtp1_pdpctxs_active Active GTPv1 PDP Contexts (GGSN)
# TYPE gtp1_pdpctxs_active gauge
gtp1_pdpctxs_active 0

# HELP ues_active Active User Equipments
# TYPE ues_active gauge
ues_active 0

# HELP gtp2_sessions_active Active GTPv2 Sessions (PGW)
# TYPE gtp2_sessions_active gauge
gtp2_sessions_active 0

# HELP gtp_node_gn_rx_parse_failed Received GTPv1C messages discarded due to parsing failure
# TYPE gtp_node_gn_rx_parse_failed counter

# HELP s5c_rx_createsession Received GTPv2C CreateSessionRequest messages
# TYPE s5c_rx_createsession counter
s5c_rx_createsession 0

# HELP s5c_rx_deletesession Received GTPv2C DeleteSessionRequest messages
# TYPE s5c_rx_deletesession counter
s5c_rx_deletesession 0

# HELP gtp_new_node_failed Unable to allocate new GTP (peer) Node
# TYPE gtp_new_node_failed counter
gtp_new_node_failed 0

# HELP s5c_rx_parse_failed Received GTPv2C messages discarded due to parsing failure
# TYPE s5c_rx_parse_failed counter
s5c_rx_parse_failed 0

# HELP sessions_active Active Sessions
# TYPE sessions_active gauge
sessions_active 0

# HELP gtp_node_gn_rx_createpdpcontextreq Received GTPv1C CreatePDPContextRequest messages
# TYPE gtp_node_gn_rx_createpdpcontextreq counter

# HELP gtp_node_gn_rx_deletepdpcontextreq Received GTPv1C DeletePDPContextRequest messages
# TYPE gtp_node_gn_rx_deletepdpcontextreq counter

# HELP bearers_active Active Bearers
# TYPE bearers_active gauge
bearers_active 0

# HELP gn_rx_parse_failed Received GTPv1C messages discarded due to parsing failure
# TYPE gn_rx_parse_failed counter
gn_rx_parse_failed 0

# HELP gtp_node_s5c_rx_parse_failed Received GTPv2C messages discarded due to parsing failure
# TYPE gtp_node_s5c_rx_parse_failed counter

# HELP gtp_peers_active Active GTP peers
# TYPE gtp_peers_active gauge
gtp_peers_active 0

# HELP gtp_node_s5c_rx_createsession Received GTPv2C CreateSessionRequest messages
# TYPE gtp_node_s5c_rx_createsession counter

# HELP gtp_node_s5c_rx_deletesession Received GTPv2C DeleteSessionRequest messages
# TYPE gtp_node_s5c_rx_deletesession counter

# HELP process_max_fds Maximum number of open file descriptors.
# TYPE process_max_fds gauge
process_max_fds 1024

# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes.
# TYPE process_virtual_memory_max_bytes gauge
process_virtual_memory_max_bytes -1

# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
# TYPE process_cpu_seconds_total gauge
process_cpu_seconds_total 7

# HELP process_virtual_memory_bytes Virtual memory size in bytes.
# TYPE process_virtual_memory_bytes gauge
process_virtual_memory_bytes 1169731584

# HELP process_resident_memory_bytes Resident memory size in bytes.
# TYPE process_resident_memory_bytes gauge
process_resident_memory_bytes 45481984

# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 515230

# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
process_open_fds 21
```

## Grafanaを実行

ここでは、GrafanaのOSS版を使用します。

### Grafana DashboardへのWebアクセス

Open5GSとPrometheusを起動後、以下の通りにGrafana-OSSを実行します。

```
docker run -d -p 3000:3000 grafana/grafana-oss
```

これで、ブラウザから以下のURLにアクセスできるようになります。なお、ログイン時のデフォルトのユーザ名とパスワードは共に`admin`です。

```
http://192.168.0.111:3000/
```

### Grafanaで使用するPrometheus data source

data source name、URL、access modeは以下の通りです。

| Name | URL | Access Mode |
| --- | --- | --- |
| Open5GS | `http://192.168.0.111:9091/` | Server |

<img width="800" alt="network-overview.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457466/45a0c233-243d-767e-521b-c656e932053b.png">

### Grafanaでメトリックを可視化する設定例

最初にGrafana Dashboardを用意し、そこに可視化したいメトリックのパネルを作成します。以下の`Metrics browser`で、三つのjob_namesから可視化したいjob_nameとメトリックを選択し、そのメトリック用のパネルのプロパティを設定してパネルを追加し、Dashboardを作成します。

以下は、AMFのメトリック`amf_session`のパネルを設定する簡単な例です。

<img width="800" alt="network-overview.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457466/6f0f2ee1-67a6-f747-e5a8-456f9fdf1458.png">

このように、Grafanaを用いてメトリック毎に魅力的なパネルを作成し、それらを組み合わせることで、使いやすいDashboardを自由にデザインできます。

## 最後に

一般に、システムには稼働状況をモニタリングする手段が用意されているものです。今回のOpen5GSはオープンソースの4G/5Gコアですが、最近になり、Prometheusでモニタリング可能なメトリックのフレームが入り、最初のメトリックが幾つか組み込まれました。今後、有益な稼働情報のメトリックが追加されていくと思います。
なお、今回紹介したNFは5GCのAMFとSMFですが、EPC(4G)のMMEにもメトリックが組み込まれました。

最後に、元記事は[Github](https://github.com/s5uishida/open5gs_5gc_ueransim_metrics_sample_config)に書いたものです。Open5GSの[チュートリアル](https://open5gs.org/open5gs/docs/)からもリンクして頂きました。

## 主な変更履歴

- [2022.09.13] 初版。