nikkie-ftnextの日記

イベントレポートや読書メモを発信

Streamlitの設定値を確認する 〜browser.gatherUsageStatsをfalseに設定できているか確認〜

はじめに

一から、いいえ、ゼロから1、nikkieです。

Streamlitのconfiguration(設定)の方法について、昨日以下の記事を書きました。

この中で設定の検証方法の筋が悪かったことに気づき、検証部分を再度アウトプットします(リトライ!)。

目次

Re: 検証:browser.gatherUsageStatsをfalseに設定する

環境変数streamlit runの引数で設定されているかをアプリの表示で検証します。

from streamlit import configし、config.get_optionで設定を確認できます!
https://github.com/streamlit/streamlit/blob/1.22.0/lib/streamlit/config.py#L131-L147

Return the current value of a given Streamlit config option.

意訳 与えられたStreamlitの設定オプションの現在の値を返す

使い方はconfig.get_option(key)で、keyは"section.optionName"形式の文字列です(例:"browser.gatherUsageStats"

検証用アプリ

browser.gatherUsageStatsの設定値を表示して確認しましょう。

app.py(前回の検証用アプリからの差分を示します)

import streamlit as st
+from streamlit import config

st.title("Awesome app!")
+
+st.write(f'{config.get_option("browser.gatherUsageStats")=}')

Dockerfileは前回同様です。
なお、前回Dockerを使ったのと揃えるために使っているにすぎず、手元でアプリを動かしても確認できます。

docker build -t practice_streamlit .

今回も「Streamlit, version 1.22.0」がインストールされたイメージです。

docker run --rm -it -p 8501:8501 practice_streamlit

http://127.0.0.1:8501/ にアクセスして、画面に表示している設定値を確認します。

config.get_option("browser.gatherUsageStats")=True

環境変数STREAMLIT_BROWSER_GATHER_USAGE_STATSによる設定

docker run --rm -it -e STREAMLIT_BROWSER_GATHER_USAGE_STATS=false -p 8501:8501 practice_streamlit

config.get_option("browser.gatherUsageStats")=False

環境変数で設定できています!
統計情報の収集は無効化されていますね🙌

trueを渡した時は、

docker run --rm -it -e STREAMLIT_BROWSER_GATHER_USAGE_STATS=true -p 8501:8501 practice_streamlit

config.get_option("browser.gatherUsageStats")=True

streamlit runの引数--browser.gatherUsageStatsによる設定

CMD命令を上書きして、streamlit runを引数込みで渡します。

docker run --rm -it -p 8501:8501 practice_streamlit streamlit run app.py --browser.gatherUsageStats false

config.get_option("browser.gatherUsageStats")=False

trueに変えると

docker run --rm -it -p 8501:8501 practice_streamlit streamlit run app.py --browser.gatherUsageStats true

config.get_option("browser.gatherUsageStats")=True

優先順位の確認

Streamlitのconfiguration 4通りは、以下の箇条書きの番号が大きいほど優先です。

  1. グローバルのtomlファイル
  2. プロジェクトごとのtomlファイル
  3. 環境変数
  4. streamlit runの引数

環境変数よりstreamlit runの引数が優先ということを確認しましょう。

  • (A) 環境変数でgatherUsageStats=false、streamlit runの引数でtrue 👉 streamlit runの引数優先でtrueになるはず
  • (B) 環境変数でgatherUsageStats=true、streamlit runの引数でfalse 👉 streamlit runの引数優先でfalseになるはず

(A)の検証

docker run --rm -it -e STREAMLIT_BROWSER_GATHER_USAGE_STATS=false -p 8501:8501 practice_streamlit streamlit run app.py --browser.gatherUsageStats true

config.get_option("browser.gatherUsageStats")=True

streamlit runの引数が優先されていますね!

(B)の検証

docker run --rm -it -e STREAMLIT_BROWSER_GATHER_USAGE_STATS=true -p 8501:8501 practice_streamlit streamlit run app.py --browser.gatherUsageStats false

config.get_option("browser.gatherUsageStats")=False

streamlit runの引数が優先されることが確認できました!

「Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False.」というメッセージが表示される仕組み

このメッセージ(_TELEMETRY_HEADLESS_TEXT2headlessモードで動かしているとき、browser.gatherUsageStats設定されていなければ出るという実装のようでした。
https://github.com/streamlit/streamlit/blob/1.22.0/lib/streamlit/runtime/credentials.py#L356-L360

if not _check_credential_file_exists() and config.get_option("server.headless"):
    if not config.is_manually_set("browser.gatherUsageStats"):
        # If not manually defined, show short message about usage stats gathering.
        click.secho(_TELEMETRY_HEADLESS_TEXT)

(不正確ですが短く言えば)config.get_option("server.headless")Trueのときに外側のif文のブロックが実行されます。
これは--server.headless引数で設定でき、ヘルプには以下のようにあります。

--server.headless BOOLEAN

If false, will attempt to open a browser window on start.

Default: false unless (1) we are on a Linux box where DISPLAY is unset,
or (2) we are running in the Streamlit Atom plugin.
[env var: STREAMLIT_SERVER_HEADLESS]

ブラウザが自動で起動しないモードの設定ですね。
詳細まで見切れていませんが、コンテナをrunしたとき、(1)を満たすのでtrueなのだと思います。

config.is_manually_setの実装は以下です。
https://github.com/streamlit/streamlit/blob/1.22.0/lib/streamlit/config.py#L970-L988

Check if a given option was actually defined by the user.

意訳 与えられた設定オプションが実際にユーザによって定義されたかを確認する

4通りの設定方法のいずれかでも設定されていたら、設定値によらずTrueを返すということですね。

私が勘違いしたのは、browser.gatherUsageStatsがtrueに設定されているときに限り、「Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False.」というメッセージが出るというものです(これは誤解でした)。
実装を見ると、trueでもfalseでも、browser.gatherUsageStatsが設定さえされていればこのメッセージは出ませんね。

終わりに

Streamlitの設定値はconfig.get_optionで確認できるというアウトプットでした。
Streamlitは4通りで設定できる! browser.gatherUsageStatsを例に - nikkie-ftnextの日記の動作検証も再実施しています。

browser.gatherUsageStatsはfalseになっていることが起動中のログから確認できないようで、「本当にfalseに設定できてる?(ドキュメントに沿ったからできてるはず)」と小さい不安を抱えていました。
今回確認できたので、この不安は退屈に変わりました!🙌