SONiCのtelemetryが動かない

[SONiC調査](https://qiita.com/masru0714/items/f1505b5da626d34a2e7c)の続きです。

# 単体で読んでもわかるように前説
- SONiCの機能の一つにtelemetryというのがある
- しかし動いてなかった
- ログなど色々調べた
- dockerコンテナの中で問題が起こっていることまではわかった

では、続きです。

# パラメータを指定してコンテナを起動する
前回はこれがなかったがために`/var/run/redis`が見えず、想定外のエラーが出ていた模様。今回はちゃんとパラメータを指定してみます。パラメータはSONiCに用意されている`/usr/bin/telemetry.sh`に書かれてたものです。コンテナの中と外でファイル名同じなのに中身が違うので混乱しそうになる点に注意。(うっかり--entrypoint=/bin/bashを指定し忘れたのですが、怪我の功名となりました)

```
$ docker rm telemetry
$ env PLATFORM=x86_64-delta_ag9032v2a-r0 HWSKU=Delta-ag9032v2a \
        docker run --net=host --privileged -it -v /etc/sonic:/etc/sonic:ro  \
        --log-opt max-size=2M --log-opt max-file=5 \
        -v /var/run/redis:/var/run/redis:rw \
        -v /usr/share/sonic/device/$PLATFORM:/usr/share/sonic/platform:ro \
        -v /usr/share/sonic/device/$PLATFORM/$HWSKU:/usr/share/sonic/hwsku:ro \
        --tmpfs /tmp \
        --tmpfs /var/tmp \
        --hostname "$HOSTNAME" \
        --name=telemetry docker-sonic-telemetry:latest
/usr/lib/python2.7/dist-packages/supervisor/options.py:298: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
  'Supervisord is running as root and it is searching '
Error: not a valid boolean value: 'always' in section 'eventlistener:supervisor-proc-exit-listener' (file: '/etc/supervisor/conf.d/supervisord.conf')
For help, use /usr/bin/supervisord -h
```

これはいけない。コンテナにくっついているファイルシステムイメージ内の`/etc/supervisor/conf.d/supervisord.conf`の記述ミス。

# 修正する

修正するにはビルドしなおしが必要ということになります。差分はこう。

```diff
diff --git a/dockers/docker-sonic-telemetry/supervisord.conf b/dockers/docker-sonic-telemetry/supervisord.conf
index b6a01de5..6cdeef82 100644
--- a/dockers/docker-sonic-telemetry/supervisord.conf
+++ b/dockers/docker-sonic-telemetry/supervisord.conf
@@ -6,7 +6,7 @@ nodaemon=true
 [eventlistener:supervisor-proc-exit-listener]
 command=/usr/bin/supervisor-proc-exit-listener
 events=PROCESS_STATE_EXITED
-autostart=always
+autostart=true
 autorestart=unexpected

 [program:start.sh]
```

# 部分ビルドしてみる
- SONiCのインストールイメージは`target/sonic-broadcom.bin`
- telemetryパッケージは`target/debs/stretch/sonic-telemetry_0.1_amd64.deb`
- make ターゲット-cleanで部分的にcleanできる

ということで早速やってみます。

```
$ make target/debs/stretch/sonic-telemetry_0.1_amd64.deb-clean
(ログ省略)
$ make target/sonic-broadcom.bin-clean
(ログ省略)
$ time make target/sonic-broadcom.bin
(ログ省略)
real    10m37.322s
user    0m2.257s
sys     0m0.426s
```

全体をcleanしてビルドしなおすと70分くらいかかるので、ビルド時間はかなり短縮できました。

# 更新したイメージで挙動が変わるかを確認
以前解説した[`sonic_installer`](https://qiita.com/masru0714/items/efcf5640ea2c5b392504)を使って更新し、リブート。果たして結果は?

```
$ show services |grep tele
telemetry       docker
root        18  6.4  0.0 629060 13904 pts/0    Sl   16:19   0:02 /usr/sbin/telemetry -logtostderr --insecure --port 8080 --allow_no_client_auth -v=2
```

動くようになりました。めでたしめでたし。

# 本家にPR?
する?

# 追伸 (2019/12/24)
PRしなかったが、[Management Frameworkのcommit](https://github.com/Azure/sonic-buildimage/commit/87f70108cb240c484dff6913500e56eda8c1bdb5)で修正された模様。試したところ、なぜか標準でtelemetry dockerが起動してなくて謎。手動で`/usr/bin/telemetry.sh start`を実行すると無事起動。上記のパッチなしで動くように修正されていました。