DockerでPromtail + Loki + Grafana(WordCloud plugin)でログ可視化をする

## 目的
NOCのタスクで、DNSクエリログの可視化をする必要が出来た。今回は、Kibanaで言うところのtagcloudの様な可視化をGrafana pluginのWordcloudを用いる事でpromtheusスタックでtagcloud環境を実装する。


## システム概要図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/ce599a4a-9bfb-6ff9-9f2a-2001594d4bd4.png)


## 設定
### 送信側
Unboundの設定

https://qiita.com/engishoma/items/ffc1258fd93307206c4f


Rsyslogの設定

https://qiita.com/engishoma/items/d255a2a0d3b99e3bef93


### 受信側

#### docker-compose
```docker-compose.yml
version: '3'
services:
  grafana:
#    image: grafana/grafana:latest
    build: ./grafana
    container_name: grafana
    hostname: grafana
    ports:
      - 3000:3000
    user: "$PID:$GID"
    volumes:
      - ./grafana:/var/lib/grafana

  rsyslog:
    build: ./syslog
    container_name: rsyslog
    ports:
      - 514:514
    volumes:
      - ./syslog/log/:/var/log/
    privileged: true


  loki:
    image: grafana/loki:latest
    container_name: loki
    ports:
      - 3100:3100
    command: -config.file=/etc/loki/local-config.yaml


  promtail:
    image: grafana/promtail:2.7.5
    volumes:
      - /var/log:/var/log
      - ./promtail/config.yml:/etc/promtail/config.yml
      - ./syslog/log/syslog:/etc/syslog
    command: -config.file=/etc/promtail/config.yml
    container_name: promtail
    ports:
      - 9080:9080
    restart: always
```

#### Dockerfile
grafana
```grafana/Dockerfile
FROM grafana/grafana
RUN grafana-cli plugins install magnesium-wordcloud-panel
```

rsyslog
```syslog/Dockerfile
FROM shomaigu/ubuntu-base:latest
RUN apt -y install rsyslog
ADD ./rsyslog.conf /etc/rsyslog.conf

RUN touch /var/log/syslog
RUN chmod 777 /var/log/syslog

ENTRYPOINT ["/usr/sbin/rsyslogd", "-n", "-iNONE"]
```

#### 各サービスのconfig
rsyslog
```rsyslog.conf
# /etc/rsyslog.conf configuration file for rsyslog
#
# For more information install rsyslog-doc and see
# /usr/share/doc/rsyslog-doc/html/configuration/index.html
#
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf


#################
#### MODULES ####
#################

module(load="imuxsock") # provides support for local system logging
#module(load="immark")  # provides --MARK-- message capability

# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")

# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")

# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")

###########################
#### GLOBAL DIRECTIVES ####
###########################

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Filter duplicated messages
$RepeatedMsgReduction on

#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
#$PrivDropToUser syslog
#$PrivDropToGroup syslog

$PrivDropToUser root
$PrivDropToGroup root



#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
```

promtail
```config.yml
server:
  # 9080 ポートで HTTP でリッスンする
  # ブラウザで開くとログのディスカバリの状態が見れます
  http_listen_port: 9080

  # grpc のリッスンポート、0 ならランダムに決定される・・・これなにに使っている の？
  grpc_listen_port: 0


clients:
  # Loki の URL を指定
  - url: http://loki:3100/loki/api/v1/push

# ログのディスカバリの設定
scrape_configs:

  # Apache のアクセスログを収集
  - job_name: access_log
    static_configs:
      - targets:
          # targets は localhost または自ホスト名のどちらかを指定する必要がある
          # とドキュメントに書いてた気がするけど何でも通る？ というかこれ指定で きる意味あるの？
          - localhost
        labels:
          # __path__ ラベルでファイル名を指定する、ワイルドカードも指定可能
          __path__: /etc/syslog
```



Grafana上で、データソースにLokiを選択し、wordcloudの選択後、CountfieldにTimeと入力し、クエリを実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/0f019939-4684-32d2-7c99-c0fea66fa6e1.png)