個人開発用macの性能監視をMetabaseでしてみた

## はじめに
この記事はMetabaseというビジネスBIツールを使ってMacの負荷状況を可視化してみようという内容になります.
ちなみに,僕はmacを普段使っていて性能監視をしたいなと思って作り始めました.
## 目次
* Metabase導入
* クライアント側で負荷状況をデータベースに書き込み
* 可視化する

## １,導入環境とMetaBase導入について
### 導入環境

クライアント側

* MacBook Air 2020 (intelモデル)メモリ16GB
* python3.8

サーバ側

* AWS EC2 
* MySQL AWS EC2 on RDB(Docker)

※今回DBをAWS EC2 on RDBを使う理由は,AWS RDBを使うよりもコスト削減につながるからです.別にAWS RDBを利用しても問題ありません.
### Metabase導入
#### サーバ側
①EC2上にjava環境がない場合にはjava環境を導入する.

```
$yum install java-1.8.0-openjdk
$yum install java-1.8.0-openjdk-devel
```

②metabase.jarのインストール
今回は,Metabaseをjarファイルを使って導入していきます

URL:https://www.metabase.com/start/oss/jar
サーバの適当なディレクトリにおく.

```:Metabaseプロセス化
[Unit]
Description=Metabase server
After=syslog.target network.target

[Service]
User=root
Type=simple
WorkingDirectory=/var/test
ExecStart=/usr/bin/java -jar /hoge/hoge/metabase.jar
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=metabase
SuccessExitStatus=143
TimeoutStopSec=120
Restart=always
[Install]
WantedBy=multi-user.target
```

③dockerでmysqlを作る

```docker:docker-compose.yml
version: '3'

services:
  # MySQL
  db:
    image: mysql:5.7
    container_name: mysql_host
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
    - 3306:3306

  # phpMyAdmin
  phpmyadmin:
    container_name: test_phpmyadmin
    image: phpmyadmin/phpmyadmin
    environment:
    - PMA_ARBITRARY=1
    - PMA_HOSTS=mysql_host
    - PMA_USER=root
    - PMA_PASSWORD=root
    ports:
    - 8080:80

```


#### クライアント側
#### クライアント側で負荷状況をデータベースに書き込み

GitHub:https://github.com/S-mishina/server-monitoring

```python:クライアント側で負荷状況をデータベースに書き込み
''' server-monitoring'''
from concurrent.futures import ThreadPoolExecutor
import sys
import time
import datetime
import psutil
import pymysql
import schedule
import daemon
#import select_monitoring

dc = daemon.DaemonContext(stdout=sys.stdout)

def hiki():
    '''
    秒数指定関数
    '''
    p_h1 = sys.argv
    if(len(sys.argv) <= 1):
        print('デフォルト60秒になります.')
        hikisu = 60
        return hikisu
    else:
        hikisu = int(p_h1[1])
        print(hikisu)
        return hikisu

def db_connect():
    '''
    データベース設定
    '''
    con = pymysql.connect(
            host='127.0.0.1',
            user='root',
            password='root',
            db='test',
            port= 3306,
            charset='utf8',
            cursorclass=pymysql.cursors.DictCursor,
        )
    return con

def job():
    '''
    jobの設定
    例えば,データベースを消去するとか...
    '''
    print(datetime.datetime.now())
    print("プログラムを実行します.")
    #select_monitoring.select()

def job1():
    '''
    jobの設定
    例えば,データベースを消去するとか...
    '''
    print(datetime.datetime.now())
    print("データベース消去を行います")
    con=db_connect()
    cur = con.cursor()
    query="DELETE FROM monitoring;"
    cur.execute(query)
    con.commit()
    cur.close()
    con.close()

def Regular():
    '''
    マルチプロセスである時間の時に処理を行うためのプログラム
    '''
    schedule.every(1).minutes.do(job)
    #schedule.every().day.at("23:59").do(job1)
    while True:
        schedule.run_pending()


def main():
    '''
    mainプログラム
    '''
    while True:
        dt_now = datetime.datetime.now()
        now_day=dt_now.strftime('%Y年%m月%d日')
        print(now_day)
        now_time=dt_now.strftime('%H:%M')
        mem = psutil.virtual_memory()
        mem_used=mem.used
        mem_total=mem.total
        mem_percent=(mem.used/mem.total)*100
        dsk = psutil.disk_usage('/')
        dsk_used=dsk.used
        dsk_total=dsk.total
        cpu=psutil.cpu_percent()
        con=db_connect()
        cur = con.cursor()
        query="INSERT INTO test (now_day,now_time,mem_used,mem_total,dsk_used,dsk_total,cpu,mem_percent) \
            VALUES (%s,%s,%s,%s,%s,%s,%s,%s) ;"
        cur.execute(query, (now_day,now_time,mem_used,mem_total,dsk_used,dsk_total,cpu,mem_percent))
        con.commit()
        cur.close()
        con.close()
        time.sleep(p_stoptime)


with dc:
    stop_time=hiki()
    p_stoptime= stop_time
    #システムのマルチプロセス化とデーモン化
    executor = ThreadPoolExecutor(max_workers=2)
    executor.submit(main)
    executor.submit(Regular)
```
## 実際にMetabaseで見てみる
#### CPUとメモリの使用率を可視化してみる.
![スクリーンショット 2021-06-14 9.18.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/3e99cd84-394e-df75-9f10-0afe6a471781.png)
#### メモリ使用状況（生データ）を可視化する.
![スクリーンショット 2021-06-14 9.27.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/d1b79480-17bb-6243-9444-17ff5c5fbf69.png)
#### 最終的なダッシュボード
![スクリーンショット 2021-06-14 9.29.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/b9cfe17e-b3c9-5eb3-478a-c7604c70bf15.png)
## 最後に
今回は,Metabaseを使って,Macbook air の性能監視を行ってみました.
普段アクティビティモニタを使って定期的に監視している方はこちら導入して使ってみるのもありかなと思いますので
ぜひご検討いただけると幸いです.
### おまけ
#### アクティビティモニタと性能監視プログラムの比較
僕のPCで見ると,アクティビティモニタはメモリを92.8MB使用しています.
![スクリーンショット 2021-06-14 9.34.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/00a1a66d-53b2-b61b-042f-fbdc375e148f.png)
対して,性能監視プログラムは,6.7MB
![スクリーンショット 2021-06-14 9.35.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/805ea93a-491f-4f3f-a82f-b514d2e6498e.png)
ということで,メモリやCPUの使用状況を見るだけならばアクティビティモニタよりメモリ使用量については優位性があるかもしれません.