地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

シモンズのマットレスを買った

ベッドフレーム、マットレス、シーツ、枕とか合わせて30万くらい。ふらっと寄った家具屋で良さげだったので買った。これまで使ってたのが10年くらい経つのでちょうど良い。今まで使ってたのもフランスベッドのやつ(フレーム込みで10万くらい)で大学生の時に買ったやつだった。ただシングル->セミダブルへの買い替えで広くなった以外に違いはあんま感じていない。敷布団->マットレスの時のような感動はもう感じることはできないらしい。

さらにハイエンドのモデルも展示してあって知らない世界が広がっていた。高級ホテルとかだとこういうのが置いてあったりするのだろうか。

www.simmons.co.jp

【MySQL】MySQL Enterprise EditionでOpenTelemetryをサポートしてた

dev.mysql.com

MySQL Enterprise Editionのみで8.1.0以降で使えるようになっているらしい!コミュニティ版にも来ることを願って期待したい。ドキュメントを読むとクライアントからMySQLの内部処理あたりのトレースができるようになるっぽい。

dev.mysql.com

これまではAPMとかからSQLを特定できても具体的にどこに時間が掛かっているのかを見るのはperformance schemを使うしか選択肢がなかったが上記の対応スパンを見るとselect scanやrows sentまでを追うことができる。traceからここまでドリルダウンできる世界が近づいている。いやーすごい。

mysqld_exporterはmy.cnfに$が入っていると変数展開しようとする

github.com

タイトルが全て

[client]
user="test"
password="aaa$bbb"

って感じで設定してある状態でmysqld_exporterを起動しようとするとパスワードが正しいとしても接続エラーとなる。回避策としてはMYSQLD_EXPORTER_PASSWORDを使うことで正しく動くようになる。

なんでこんな動きなの?

mysqld_exporterが使っているiniのパーサの設定がそうなっているため。これは無効にするオプションとかもmysqld_exporterでは現状提供されていないので$のような文字を使う場合は先ほど挙げた環境変数設定の一択となる。my.cnfを置くみたいなのって結構使う気がするんだけどこれで良いのか?と思った。ファイルシステムにファイルを置くみたいなのよりも環境変数で全部やりましょうという時代なのだろうか

github.com

issueを漁ったけど困ってそうな人は見つけられなかった。DSNでの設定も昔からあるっぽいのでmy.cnfでやる人は少数派なのかもしれない。

この処理はどこでやってるの?

github.com

ValueMapperが設定されている場合はの部分に一致する。そこで変数展開が行われる。

func (k *Key) transformValue(val string) string {
    if k.s.f.ValueMapper != nil {
        val = k.s.f.ValueMapper(val) // os.ExpandEnvが指定されているのでパスワードに$が入っていると展開しようとする
    }

    // Fail-fast if no indicate char found for recursive value
    if !strings.Contains(val, "%") {
        return val
    }
    for i := 0; i < depthValues; i++ {
        vr := varPattern.FindString(val)
        if len(vr) == 0 {
            break
        }

        // Take off leading '%(' and trailing ')s'.
        noption := vr[2 : len(vr)-2]

        // Search in the same section.
        // If not found or found the key itself, then search again in default section.
        nk, err := k.s.GetKey(noption)
        if err != nil || k == nk {
            nk, _ = k.s.f.Section("").GetKey(noption)
            if nk == nil {
                // Stop when no results found in the default section,
                // and returns the value as-is.
                break
            }
        }

        // Substitute by new value and take off leading '%(' and trailing ')s'.
        val = strings.Replace(val, vr, nk.value, -1)
    }
    return val
}

【Thanos】入門する

github.com

Thanosとは

Thanosは、Prometheusのデータを長期間保存し、大規模な監視環境での可視性と可用性を向上させるためのオープンソースプロジェクトです。Prometheusはクラウドネイティブな監視ツールとして広く使われていますが、そのままでは長期間のデータ保持や大規模なクラスターを跨いだ監視にいくつか制限があります。Thanosはこれらの課題に対処し、以下のような機能を提供して、Prometheusのスケーラビリティと信頼性を高めます。

Thanosの主な機能

  • 長期データ保持: Prometheusサーバーから収集したデータを効率的に長期間保存することができます。これにより、時間をかけてパフォーマンスや使用状況のトレンドを分析することが可能になります。
  • スケーラビリティ: Thanosは、複数のPrometheusインスタンスからデータを集約し、大規模な監視環境においても効率的なクエリ実行を実現します。
  • 高可用性: 複数のデータソースからのデータを合成し、一部のソースが利用不可になった場合でもデータの損失や監視の中断を最小限に抑えます。
  • コスト効率: Thanosはクラウドストレージ(例:Amazon S3Google Cloud Storage、Microsoft Azure Blob Storage)と統合され、コスト効率の良いデータ保存を可能にします。
  • 柔軟なデプロイメント: Thanosコンポーネントは、既存のPrometheusセットアップに簡単に統合でき、柔軟なデプロイメントオプションを提供します。

コンポーネント

Thanosは、その機能を実現するためにいくつかの主要コンポーネントで構成されています。例えば:

  • Sidecar: Prometheusサーバーに添付され、データをクラウドストレージにアップロードすると同時に、Thanosクエリレイヤーからのクエリに応答します。
  • Querier (Query): 複数のPrometheusサーバーとSidecarからデータを集約し、統合されたビューを提供します。
  • Store: 長期保存されたデータをクラウドストレージから読み出し、クエリに応答します。
  • Compactor: クラウドストレージ内のデータを効率化し、コストを削減するためにデータを圧縮し、最適化します。
  • Ruler: アラートルールとレコーディングルールを評価し、結果をPrometheusフォーマットで保存します。

Thanosを使用することで、Prometheusベースの監視システムをより強力にし、企業や組織が大規模なインフラストラクチャを効果的に監視する能力を高めることができます。

参考

openstandia.jp

blog.fltech.dev

qiita.com