Omnibus GitLabのexporterをプロキシでまとめて外部のPrometheusで監視する。

初めて書くのでお手柔らかにお願いします〜

GitLabにはビルトインでPrometheusと様々なexporterがあるが、外部のPrometheusからアクセスする場合にそれぞれのexporterの設定をしないといけないので`exporter-exporter`（exporterのプロキシ）を使って楽する。

※ 正直どちらのやり方でも手間は変わらないです。

ファイアウォールにあまりポートを開けたくない場合は良いかもしれない。

### 最終構成

- Ubuntu (GitLab用)
    - GitLab Omnibus
    - exporter-exporter (systemdで管理)
    - その他お好みでExporter
- Ubuntu（監視用）
    - Prometheus
    - alertmanager
    - Grafana

※ GitLab Omnibusのインストールに関しては書いてないので公式ドキュメントや先人の方々の記事を参考にしてください。

`exporter_exporter`等でリバースプロキシを**介さない**場合は`gitlab.rb`の`*_exporter['listen-address'] = localhost:*`を編集し、外部に設置するprometheusのホストを許可する必要があります。

[参考](https://docs.gitlab.com/ee/administration/monitoring/prometheus/#changing-the-port-and-address-prometheus-listens-on)

# GitLabのconfig

ビルトインのPrometheus・alertmanager・Grafanaを無効化


```bash
$ vim /etc/gitlab/gitlab.rb
```

```ruby=gitlab.rb
# ...前略

################################################################################
## Prometheus
##! Docs: https://docs.gitlab.com/ee/administration/monitoring/prometheus/
################################################################################

# ...中略

prometheus['enable'] = false

# ...中略

################################################################################
## Prometheus Alertmanager
################################################################################

alertmanager['enable'] = false

# ...中略

################################################################################
## Grafana Dashboards
##! Docs: https://docs.gitlab.com/ee/administration/monitoring/prometheus/#prometheus-as-a-grafana-data-source
################################################################################

grafana['enable'] = false

# ...後略
```

# exporter-exporter

[GitHub](https://github.com/QubitProducts/exporter_exporter)

## ReleaseからDL

今回Ubuntuなのでlinux-amd64

```bash
# DLして解凍
$ wget https://github.com/QubitProducts/exporter_exporter/releases/download/v0.4.5/exporter_exporter-0.4.5.linux-amd64.tar.gz
$ tar xf exporter_exporter-0.4.5.linux-amd64.tar.gz
```

バイナリを配置

```bash
$ cp ./exporter_exporter-0.4.5.linux-amd64/exporter_exporter /usr/local/bin
```

## configファイル作成

今回はgitlab-ceなので`pgbouncer_exporter`はコメントアウトしています。

```bash
$ vim /etc/prometheus/expexp.yml
```

```yaml
modules:

  ################################################################################
  ## Managed by GitLab Omnibus
  ################################################################################

  redis:
    method: http
    http:
      port: 9121
  postgres:
    method: http
    http:
      port: 9187
  node:
    method: http
    http:
      port: 9100
  gitlab-workhorse:
    method: http
    http:
      port: 9229
  gitlab-rails:
    method: http
    http:
      port: 8080
      path: '/-/metrics'
  gitlab-sidekiq:
    method: http
    http:
      port: 8082
  gitlab_exporter_database:
    method: http
    http:
      port: 9168
      path: '/database'
  gitlab_exporter_sidekiq:
    method: http
    http:
      port: 9168
      path: '/sidekiq'
  gitlab_exporter_ruby:
    method: http
    http:
      port: 9168
      path: '/ruby'
  gitaly:
    method: http
    http:
      port: 9236
  # pgbouncer:
  #   method: http
  #   http:
  #     port: 9188
```

## systemdで管理

### Unitファイル

```bash
$ vim /lib/systemd/system/prometheus-exporter-exporter.service
```

```vim
[Unit]
Description=Exporter Exporter - prometheus exporter proxy
Documentation=https://github.com/QubitProducts/exporter_exporter
After=network-online.target

[Service]
ExecStart=/usr/local/bin/exporter_exporter -config.file '/etc/prometheus/expexp.yaml'
ExecStop=/bin/kill -TERM ${MAINPID}
ExecReload=/bin/kill -HUP ${MAINPID}

[Install]
WantedBy=multi-user.target
```

### 実行

```vim
# Unitファイルを読み込ませる
$ systemctl daemon-reload

# 実行
$ systemctl start prometheus-exporter-exporter.service
$ systemctl status prometheus-exporter-exporter.service
```

```bash
$ curl localhost:9999

<h2>Exporters:</h2>
<ul>
  <li><a href="/proxy?module=gitaly">gitaly</a></li>
  <li><a href="/proxy?module=gitlab-rails">gitlab-rails</a></li>
  <li><a href="/proxy?module=gitlab-sidekiq">gitlab-sidekiq</a></li>
  <li><a href="/proxy?module=gitlab-workhorse">gitlab-workhorse</a></li>
  <li><a href="/proxy?module=gitlab_exporter_database">gitlab_exporter_database</a></li>
  <li><a href="/proxy?module=gitlab_exporter_ruby">gitlab_exporter_ruby</a></li>
  <li><a href="/proxy?module=gitlab_exporter_sidekiq">gitlab_exporter_sidekiq</a></li>
  <li><a href="/proxy?module=node">node</a></li>
  <li><a href="/proxy?module=postgres">postgres</a></li>
  <li><a href="/proxy?module=redis">redis</a></li>
</ul>
```

`<a>`タグのURIではそれぞれのexporterのメトリクスを見ることができます。

# Prometheus

以降はGitLabを動かしているホストではなく監視用のホストで構築

```bash
$ apt install prometheus alertmanager
```

```bash
$ vim /etc/prometheus/prometheus.yml
```

※ `gitlab.example.com`はGitLabとexporter_exporterを配置したホストのドメインまたはIPアドレスに置き換えてください。

```yaml
global:
  scrape_interval: 15s
  scrape_timeout: 15s
  external_labels: {}

remote_read: []
remote_write: []
rule_files: []

alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - 127.0.0.1:9093

scrape_configs:
  ################################################################################
  ## Prometheus
  ################################################################################

  - job_name: prometheus
    static_configs:
      - targets:
          - 127.0.0.1:9090

  ################################################################################
  ## Managed by gitlab-ce
  ################################################################################

  - job_name: redis
    metrics_path: /proxy
    params:
      module:
        - redis
    static_configs:
      - targets:
          - gitlab.example.com:9999
  - job_name: postgres
    metrics_path: /proxy
    params:
      module:
        - postgres
    static_configs:
      - targets:
          - gitlab.example.com:9999
  - job_name: node
    metrics_path: /proxy
    params:
      module:
        - node
    static_configs:
      - targets:
        - gitlab.example.com:9999
  - job_name: gitlab-workhorse
    metrics_path: /proxy
    params:
      module:
        - gitlab-workhorse
    static_configs:
      - targets:
          - gitlab.example.com:9999
  - job_name: gitlab-rails
    metrics_path: /proxy
    params:
      module:
        - gitlab-rails
    static_configs:
      - targets:
          - gitlab.example.com:9999
  - job_name: gitlab-sidekiq
    metrics_path: /proxy
    params:
      module:
        - gitlab-sidekiq
    static_configs:
      - targets:
          - gitlab.example.com:9999
  - job_name: gitlab_exporter_database
    metrics_path: /proxy
    params:
      module:
        - gitlab_exporter_database
    static_configs:
      - targets:
          - gitlab.example.com:9999
  - job_name: gitlab_exporter_sidekiq
    metrics_path: /proxy
    params:
      module:
        - gitlab_exporter_sidekiq
    static_configs:
      - targets:
          - gitlab.example.com:9999
  - job_name: gitlab_exporter_ruby
    metrics_path: /proxy
    params:
      module:
        - gitlab_exporter_ruby
    static_configs:
      - targets:
          - gitlab.example.com:9999
  - job_name: gitaly
    metrics_path: /proxy
    params:
      module:
        - gitaly
    static_configs:
      - targets:
          - gitlab.example.com:9999
  # - job_name: pgbouncer
  #   metrics_path: /proxy
  #   params:
  #     module:
  #       - pgbouncer
  #   static_configs:
  #     - targets:
  #         - gitlab.example.com:9999
```

```bash
$ systemctl restart prometheus
```

監視自体はこれで完成！:tada:

# Grafana

```bash
$ apt install grafana
```

## Dashboardを移植

GitLab OmnibusのGrafanaにはダッシュボードが用意されているのでそれらを書き換えて移植します。

元のファイルの場所
- `/var/opt/gitlab/provisioning`
- `/opt/gitlab/embedded/service/grafana-dashboards`


データソースやダッシュボードの定義ファイルを`/etc/grafana/provisioning`に下記のように配置します。

[GitHub](https://github.com/tingtt/gitlab_omnibus_external_grafana_dashboard)

PromQLのインスタンス指定のポートをexporter_exporter用の9999に書き換えています。

```
/etc/grafana
└── provisioning
    ├── dashboard_options
    │   └── gitlab_omnibus
    │       ├── gitaly.json
    │       ├── overview.json
    │       ├── postgresql.json
    │       ├── rails-app.json
    │       ├── redis.json
    │       └── service_platform_metrics.json
    ├── dashboards
    │   └── gitlab_dashboards.yml
    └── datasources
       └── gitlab_datasources.yml
```

```bash
$ systemctl restart grafana-server.service
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908316/a53c0dab-2da8-3e44-9f5b-5cff6d81a933.png)

移植完了！:tada:

GitLab Omnibusはビルトインでいろいろ含まれていてそれぞれコンフィグなどのファイルがたくさんあるので探し回るだけでも楽しかったです！

# 参考 / リポジトリ

[Monitoring GitLab with Prometheus](https://docs.gitlab.com/ee/administration/monitoring/prometheus/)　

[QubitProducts/exporter_exporter](https://github.com/QubitProducts/exporter_exporter)