[‘host.name’] ClickHouse では、Observability を念頭に置いて、もう 1 つの信頼できる時間分析の自己規律を確立しています。 ClickHouse は、非常にパフォーマンスの高い信頼できる時間分析データベースとして、時系列 [{‘message.id’:‘1’,‘message.type’:‘RECEIVED’},{‘message.id’:‘2’,‘message.type’:‘SENT’}] の信頼できる時間分析を含む、大量の枯渇ケースの影響を受けやすくなっています。 情報。 排気ケースの変動は、
分析能力の大きな変動に圧力をかけるのに役立ち、クエリを支援します。ほとんどの情報の種類。 これらはファセットから情報を求め、過剰な圧縮料金をランク付けし、ユーザーが ClickHouse を使い果たしてオブザーバビリティ情報を保存するように導きました。 この情報には、ログ、メトリクス、トレースの 3 つのよくある種類があります。 このブログ、可観測性シリーズの 2d では、マーク情報がどのように発生する可能性があるかを探ります。 これをマフラーに絞ってランキングしてみましたOpenTelemetry のマーク情報を取得して ClickHouse に保存します。 Grafana とブレンドした場合、および ClickHouse プラグイン 内の最近の特性は、トレースはポイントを検出および診断する際に、ガジェットの習慣とパフォーマンスの詳細な作業を構成するために、視覚化された情報を伝達せずに、ログとメトリックとブレンドすることができます。
ランキングは、例が再現される可能性が高いという予感を試みました。この投稿は情報のシーケンスと視覚化の基礎に特化していますが、スキーマの最適化に関するいくつかの指針がランキングに含まれています。 機能を念頭に置いておきましょう。ランキングが 正当な OpenTelemetry デモ
にフォークされました。 )、ClickHouse の強化と、トレースを視覚化するための OOTB Grafana ダッシュボードを含みます。 テレメトリは情報です習慣に関するガジェットから発せられます。 この情報は、ログ、メトリック、およびトレースのランキングを蓄積できます。 マークは、マイクロサービスやサーバーレス機能と同様に、リクエストがマルチプロバイダー アーキテクチャを介して伝播する際に (ソフトウェア プログラムまたは殺人者によって作成された) リクエストがたどったパスを記録します。 1 つのマークには、労働単位または操作単位ごとに、1 組のスパンが含まれます。 スパンは、他のメタデータ[{‘message.id’:‘1’,‘message.type’:‘RECEIVED’},{‘message.id’:‘2’,‘message.type’:‘SENT’}]を除いて、主に操作にかかった時間の小さな出力を提供します および接続されたログ メッセージ。 これらのスパンはツリーとして接続された階層であり、最初のスパンはルートに関するものであり、開始から開始までの合計マークを保持します。 このルートと後続のすべてのスパンの下で、若い操作がキャプチャされます。 ツリーをナビゲートすると、上のレベルを生成する若い操作と手順を明らかにすることができます。 これにより、特有の要求によって実行される作業に関して、ますます多くのコンテキストが得られます。 以下に視覚化します: ” src=”http://clickhouse.com/uploads/traces_concept_4908965e1c.png”/> これらのトレースは、メトリクスやログと組み合わせると、ポイントの検出とバックボーンのためのガジェットの習慣に関する洞察を得る上で重要になる可能性があります.
OpenTelemetry プロジェクトは、オブザーバビリティ情報の取り込み、改造、およびバックエンドへの送信を可能にする SDK、API、およびサブスタンスで構成される、ディーラー中立の配信ソース フレームワークです。特に、これにはいくつかの最も主要な物質が含まれています:
のスペースメトリクス、ログ、およびトレースが無音である可能性がある方法の仕様と規則これには、明示的な言語のブローカー向けのソリューションと、 と歩調を合わせた OpenTelemetry Line Protocol (OTLP) の強力な仕様が含まれています。 protobuf。 これにより、購入者とサーバーのインターフェイスとメッセージ構造の強力な説明を提供することで、サービス間で情報を送信できます。 可観測性情報を計測、生成、収集、エクスポートするための明示的な言語ライブラリとSDK。 ここがマーク情報の列とめちゃくちゃ繋がってる [‘host.name’] OTELコレクター[] は Golang で書かれており、オブザーバビリティ情報の受信、処理、およびエクスポートのディーラーにとらわれない実装を提供します。 OTEL Collector は、Prometheus や OTLP に似たいくつかの入力フォーマットと、ClickHouse を含むさまざまなエクスポート ターゲットをサポートすることで、集中処理ゲートウェイを提供します。 要約すると、OpenTelemetry はログ、メトリック、およびトレースのシーケンスを標準化します。 重要なのは、この情報をオブザーバビリティ バックエンドに保存することは今では問題ではありません – ClickHouse の出番です! タグ情報はほとんどの場合、すべてのスパンが行を持つ単一のテーブルとして表されます。 この情報フォームに過剰な圧縮を提供するだけでなく、ClickHouse は追加の豊富な SQL インターフェイスを提供します トレースのクエリを矮小化する分析機能 。 Grafana と組み合わせると、ユーザーは、トレースを保存および視覚化する非常に価格効率の高いシステムをランク付けします。 他の小売店がおそらく同じ圧縮範囲を提供する可能性がありますが、ClickHouse はアリーナで最も高速な分析データベースであるため、この低レイテンシーのクエリを組み合わせる点で異常です。 方向性としては、これらの特性により、ClickHouse は正確に、多くのビジネス可観測性の選択肢が崇拝する最も高く評価されているバックエンドに変わりました: Signoz.io, Highlight.io, BetterStack、または自家製の明確なスケールの可観測性プラットフォームが崇拝する Uber, Cloudflare、または [{‘message.id’:‘1’,‘message.type’:‘RECEIVED’},{‘message.id’:‘2’,‘message.type’:‘SENT’}] Gitlab. インストルメンテーション ライブラリは、最も一般的な言語用に提供されています。 これらは、主に最も頻繁なメトリックとマーク情報を取得するためにソフトウェア プログラム/サービス フレームワークが利用されるコードのすべての自動インストルメンテーション、およびハンドブック インストルメンテーション ソリューションを提供します。 自動インストルメンテーションは常に満足のいくものですが、後者では、ユーザーがコードの明示的な部分をインストルメント化できるようになり、ソフトウェア プログラムの明示的なメトリックとマーク情報をキャプチャして、追加の伝達が可能になる可能性があります。 このウェブログの機能については、マーク情報の取得が最も簡単です。 OpenTelemetry デモ ソフトウェア プログラムには、マイクロサービス アーキテクチャ 多くの従属サービスをすべて偶数言語で使用して、実装者に参照を提供します。 以下の簡単な例は、マーク情報を取得するための Python Flask API のインストルメンテーションを示しています:
from opentelemetry 輸入 マーク から ランダム 輸入 randint from フラスコ 輸入 Flask, demand tracer=mark.get_tracer(__name__) app=Flask(__name__) @app.route( "/さいころを振る" ) def[{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] さいころを振る():
戻る
str(do_roll())def do_roll (): with トレーサー。 start_as_current_span("do_roll")) として ロールスパン: res=randint( 1 , 6) ロールスパン.set_attribute("roll.price", レス) 戻る res すべてのライブラリに関する膨大なハンドブックは、このウェブログの範囲をはるかに超えています。彼の接続されたドキュメントまたは彼女の言語. OTEL コレクターは、計測ライブラリからのマーク情報と同様に、オブザーバビリティ ソースから情報を受け取り、この情報を処理して、ターゲット バックエンドにエクスポートします。 OTEL Collector は、Prometheus や OTLP に似た複数の入力フォーマットと、ClickHouse を含むさまざまなエクスポート ターゲットをサポートすることで、集中処理ゲートウェイも提供する可能性があります。 コレクターは、パイプラインのアイデアを使い果たします。 これらは、ログ、メトリック、またはトレースの形式である可能性が高く、レシーバー、プロセッサー、およびエクスポーターで構成されます。
" src="http://clickhouse.com/uploads/otel_collector_fef083663e.png"/>
受信機 このアーキテクチャでは、OTEL 情報を入力するため、機能します。これは、プル モデルまたはプッシュ モデルのいずれかを介して行われます。これは、プロトコルの選択によって発生する可能性がありますが、インストルメンテーション ライブラリからのマーク情報がプッシュされる可能性がありますOTLP gRPC または HTTP のいずれかの排出 これに起因するプロセッサフィルタリング、バッチ処理、エンリッチメント機能を提供するこの情報に関する真実のモジー. 最後に、エクスポーターは、プッシュまたはプルのいずれかを介してバックエンド シャトル フィールドにレコードを送信します. この場合、レコードを ClickHouse にプッシュできる可能性があります. ゲートウェイ/アグリゲーターとして非常に一般的に影響を受けやすいレベルであり、バッチ処理と同様の職務を処理します。再試行すると、コレクターはおそらくエージェント自体として展開される可能性があります。これは、以前の投稿で説明されているように、ログ シーケンスに役立ちます。 OTLP は、gRPC または HTTP で発生する可能性が高い、ゲートウェイとエージェントの状態の間の口頭での交換に典型的な OpenTelemetry 情報を表します。 反対に、マーク シーケンスの機能については、以下で証明されているように、コレクタはゲートウェイとして展開されるだけです: " src="http://clickhouse.com/uploads/otel_architecture_248c22ed3a.png"/> より大きな負荷環境では、非常に優れたアーキテクチャが想像できるレベル. これをお勧めします 想像できる選択肢について議論している非常に正確なビデオ. ClickHouse は、 を通じて OTEL エクスポーター内でサポートされています。 コミュニティへの貢献 、ログ、トレース、およびメトリクスを強化. ClickHouse による口頭での置換は、最適化されたネイティブ構造と正規の Trip クライアント全体のプロトコルで行われます. OpenTelemetry C の使い果たされるよりも早く コレクター、ユーザーはおそらく無音で次のファセットを割り当てる可能性があります: エクスポータはコア OTEL ディストリビューションでは配布されませんが、contrib 画像。 これは事実上、どの HELM チャートでも認定された Docker イメージが使い果たされることを意味します。 より無駄のない展開の場合、ユーザーは 最も単純な重要な物質でカスタム コレクター イメージを作成します。 バージョン 0.74 の時点で、
デフォルト
(デモフォーク内で影響を受けやすいため).作成 データベース otel [{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] エクスポーターはアルファ版であり、ユーザーはおそらく無言でアドバイスに従う可能性があります OpenTelemetry. が提供
タイムアウト:" src="http://clickhouse.com/uploads/otel_demo_ab40c40d7f.png"/>
OpenTelemetry はデモ ソフトウェア プログラムを提供します 実装の有用なインスタンスを提供しますOpenTelemetry の. これは、望遠鏡を販売する Web ストアを強化する分散型マイクロサービス アーキテクチャです. この電子商取引の枯渇事例は、ソリューション、資金、および外国為替変換などの単純で理解可能なサービスの幅広い変動の可能性を構築するのに役立ちます. The storefront is subject to a load generator, which cause every instrumented provider to generate logs, traces, and metrics. 開業医が最もよく評価されている言語の計測方法を教えられる賢明なインスタンスを提供するだけでなく、このデモでは、 OpenTelemetry とオブザーバビリティ バックエンドの統合をビデオで紹介するディストリビューターで、この精神に基づいて、ランキングを獲得しました は、このソフトウェア プログラム を fork して、 ClickHouseにマーク情報を保存するように変更したかった. " src="http://clickhouse.com/uploads/otel_demo_architecture_4c2b4164ce.png"/>上記のアーキテクチャ内で影響を受ける言語の幅広さ、および資金や提案に類似した操作を扱う物質の選択に対応するレベル。 最もよく評価されている言語のプロバイダーのコードをテストします
。ゲートウェイとしてコレクターが存在するため、ランキングは変更されていません。このアーキテクチャ上の分離は、OpenTelemetry の明らかな利点の 1 つです - バックエンドは、コレクター内のターゲット エクスポーターの取引を強化することで変更される可能性があります. デモでは、プロバイダーごとに Docker コンテナーが使い果たされます。デモは、docker attach および 内で説明されている手順正当な書類 、独自のリポジトリの ClickHouse フォークを置き換えます。ギット クローン https://github. com/ClickHouse/opentelemetry-demo.git cd opentelemetry-demo/ docker attach up -- 製造禁止
ランキングdocker-attach ファイル を変更して、今後の情報に ClickHouse インスタンスを含めるようにしました。
クリックハウス
. このデモは、Kubernetes に展開することなく 正当な指示。 をコピーすることをお勧めしますvalues ファイル と の編集コレクター構成。 すべてのスパンを ClickHouse Cloud インスタンスに送信するサンプル値ファイルは、ここ。 これは、変更されたヘルムテルでダウンロードされ、展開されます。つまり、helm install -f values.yaml my-otel-demo delivery-telemetry/opentelemetry-demo この投稿では、トレースを最も簡単にエクスポートすることに関心があります。 ログとメトリクスが ClickHouse に保存される可能性もありますが、簡単にするためにデフォルト設定を使い果たします。 ログはデフォルトで有効になっておらず、メトリクスは Prometheus に送信されます。 マーク情報を出荷するにはClickHouse には、常にファイル全体にカスタム OTEL コレクター構成を追加する必要があります
デフォルトotel-config-extras.yaml 。 これは とマージされます最も主要な構成 であり、既存の宣言をオーバーライドします。 追加の構成は以下で証明されています: 輸出業者: クリックハウス:
終点: tcp://クリックハウス: 9000?dial_timeout=10s&compress=lz4 データベース:ttl_days: 3
traces_table_name:otel_traces
5s retry_on_failure:
有効: 適切な initial_interval:5秒 max_interval: 30代 最大経過時間:
300s プロセッサ: バッチ: タイムアウト:
5s send_batch_size:
100000
プロバイダ: パイプライン:
痕跡: 受信者:
[otlp] [] プロセッサ: [spanmetrics, batch] 輸出業者: [logging, clickhouse] 以下にリストされている主な変更点は、ClickHouse をエクスポーターとして構成することです。 キー設定についてはこちら:
clickhouse ここ。 これは、ローカル デプロイの Docker イメージに追加されたクリックハウス コンテナーです。 たとえば、ClickHouse Cloud クラスターを証明するために、このルートを自由に変更してください。
ttl_days
- これは、TTL 特性全体で ClickHouse の情報保持を制御します。 以下のフラグメント「スキーマ」を見てください。 トレース パイプラインは、OTLP レシーバーを使用して計測ライブラリからマーク情報を受け取ります。 このパイプラインは、この情報を 2 つのプロセッサに渡します:
A
バッチプロセッサ は、最大で 5 秒ごと、またはバッチ ディメンションが 100k に達したときに INSERT が発生することを保証する責任があります。 これにより、挿入が効率的にバッチ処理されます。 あ スパンメトリクスプロセッサー。 これにより、マーク情報からの需要、エラー、およびメトリックが集約され、メトリック パイプラインに転送されます。 これについては、後でメトリクスについて説明します。 展開したらすぐにいいね! マーク情報が ClickHouse に送信されていることを立証することができます。 otel_traces
。 これは、すべてのスパンが発送される重要な情報を表します。 コンテナへの入場を確保するためのレベルclickhouse-client (それはデフォルトの 9000 ポートのホストでサウンドレスが公開される可能性もあります)。選択する *から
otel_traces LIMIT 1 FORMAT Vertical Row 1: ────── タイムスタンプ: 2023-03-20 18:04: 35.081853291 TraceId: 06cabdd45e7c3c0172a8f8540e462045 SpanId: b65ebde75f6ae56f ParentSpanId: 20cc5cb86c7d4485 TraceState : SpanName: otldemo.AdService/GetAds SpanKind: SPAN_KIND_SERVER ServiceName: adservice ResourceAttributes: { 'telemetry.auto.version': '1.23.0',「os.description」 : 「Linux 5.10.104-linuxkit」 ,
'process.runtime.description': 'Eclipse Adoptium OpenJDK 64 ビットサーバー VM 17.0.6+10' ,'provider.title':
「アドサービス」 ,'provider.namespace'
: 'opentelemetry-demo','telemetry.sdk 。バージョン': '1.23.1','process.runtime.version': '17.0.6+10','telemetry.sdk.title': ' opentelemetry','host.arch': 'aarch64','host.title': 'c97f4b793890','process.executable.route': '/opt/java/openjdk/bin/java','process.pid': '1','process.runtime.title' :
「OpenJDK ランタイム環境」,'container.identification'
,’os.form’: ‘linux’,’process.command_line’: ‘/opt/java/openjdk/bin/java -javaagent:/usr/src/app/opentelemetry-javaagent.jar’,’telemetry.sdk.language’: ‘ジャバ’} SpanAttributes: {‘thread.title’: ‘grpc-default-executor-1’: 'c97f4b7938901101550efbda3c250414cee6ba9bfb4769dc7fe156cb2311735e'
,
'app.commercials .contextKeys': ‘[]’,‘secure.host.title’: ‘アドサービス’,’app.commercials.ad_request_type’: ‘ NOT_TARGETED’,’rpc.system’: ‘GetAds’,’secure.host.port’: ‘9555’,’secure.sock.sight.port’: ‘37796’,’rpc.provider’: ‘otldemo.AdService’、‘安全。輸送’: ‘ip_tcp’,‘app.commercials.contextKeys.count’: ‘0’,‘app.commercials.count’: ‘2’,’app.commercials.ad_response_type’: ‘ランダム’,’secure.sock.sight.addr’: ‘172.20.0.23’ ,‘rpc.gadget’: ‘grpc’,’rpc.grpc.status_code’: ‘0’,’thread.identification ‘: ’23’} 間隔:
218767042 StatusCode: STATUS_CODE_UNSET StatusMessage: Events.Timestamp: [] Events.Title: [{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] Events.Attributes : [{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] Links.TraceId: [] Links.SpanId: [] Links.TraceState: [] Links.Attributes: [] すべての行はスパンを表し、その一部はルート スパンでもあります。 いくつかの重要なフィールドがあり、頻繁に作業することで、役立つクエリを実行できるようになります。 マーク メタデータの詳細な説明が用意されています ここ: [{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] TraceId[{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] - タグ識別は、スパンがフラグメントであるマークを表します SpanId - スパンの異常な識別 ParentSpanId - スパンの親スパンのスパン ID。 これにより、直感的な通話履歴を構築できます。 ルート スパンの場合、これは空になります。 SpanName - 操作のタイトル )Events.Timestamp, Events.Title 、 とSpanKind - スパンが作成されると、その種類は、コンシューマー、サーバー、内部、プロデューサー、または特定の人のいずれかになります。 This Kind は、トレース バックエンドに対して、マークが無音で組み立てられる可能性があることを示します。 それは、スパンとその若い人々や両親との関係を効果的に説明しています. サービス名 - Span の発信元である Adservice などのプロバイダのタイトル - 注釈を付けるために使い尽くすメタデータを持つキーと価格のペア追跡している操作に関する情報を生成する Span。 これは、例として、ポッドのタイトルやホストに関連する値などの Kubernetes 情報を保持する可能性があります。 私たちのスキーマのレベルでは、キーと値がマップ形式のすべての文字列になるように強制されます。
SpanAttributes - 追加のスパン レベル属性、たとえば ステータスコード - UNSET、OK、または ERROR の両方。 後者は、例外と同様に、ソフトウェア プログラム コード内に確認済みのエラーがある場合、おそらくスペースになります。 )thread.identification . Duration - スパンの長さ (ナノ秒単位)
イベント* - ダッシュボードの概要とは異なる可能性がありますが、これらはソフトウェア プログラム開発者を熱狂させる可能性があります。 これは、スパンの構造化された注釈であると考えられます。 たとえば、ページがインタラクティブに変わるときなど、スパンの長さのいたるところで意味のある特異点を示す可能性が絶え間なくあります。
Events.Attributes は、かなりのトーナメントを再構築する可能性があります - これが配列の位置に依存していることを示します. リンク集
– これらは、少なくとももう 1 つのスパンとの非公式な関係を示しています。 これらは、この明示的な操作の結果として実行される非同期操作でもあることに注意してください。 要件操作に起因してキューに入れられた処理ジョブも、適切なスパン ハイパーリンクです。 ここで、開発者はおそらく、最初のマークから 2d マーク内の最初のスパンへの終了スパンをハイパーリンクして、それらを因果的にパートナーにすることができます。 ClickHouse スキーマでは、配列の種類と列の位置を関連付ける時間を数えます Links.TraceId,Links.SpanId 、 と1 )), `Links.TraceState` 配列(文字列) CODEC(ZSTD( 1Links.Attributes . [{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] コレクターが明示的なコーデックを課すことを含め、スキーマについて意見を述べているレベル。 これらは、長年確立されたケースのかなり正確な選択を意味しますが、コレクターの構成を通じて、ユーザーが必要に応じて構成を調整することを殺します. コーデックまたは ORDER BY キーを変更したいお客様 (例: fit person-explicit セキュアなパターンへの入場、ひょっとして無音のテーブルをプレハブして来るかもしれません
` DateTime64(9) CODEC(Delta( 8), ZSTD(作成 TABLE otel_traces ( `タイムスタンプ)1)), `TraceId`文字列 CODEC(ZSTD(1)), `SpanId` 文字列 CODEC(ZSTD( 1[{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] )), `ParentSpanId` String CODEC(ZSTD([logging, clickhouse] 1 )), `TraceState` String CODEC(ZSTD(['host.name'] 1 )), `SpanName` LowCardinality(文字列) CODEC(ZSTD( 1)), `SpanKind` LowCardinality(String) CODEC(ZSTD( 1
)), `ServiceName` LowCardinality(String) CODEC(ZSTD( 1 )), `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD( 1 )), `SpanAttributes` Map(LowCardinality(String), String) CODEC(ZSTD( 1 )), `Duration` Int64 CODEC(ZSTD( 1 )), `StatusCode` LowCardinality(String) CODEC(ZSTD( 1)), `StatusMessage` String CODEC(ZSTD( 1 )), `Events.Timestamp` 配列(DateTime64(9)))コーデック(ZSTD(
1 )), `Events.Title`
配列(LowCardinality(String)) CODEC(ZSTD( 1)), `Events.Attributes` 配列(Map(LowCardinality(文字列), 文字列)) CODEC(ZSTD(1)), `Links.TraceId` 配列 (文字列) CODEC(ZSTD(1)), `Links.SpanId` 配列(文字列) CODEC(ZSTD(
)), `Links.Attributes`TTLとは全然違う(下の隙間)このスキーマに関していくつかの重要な観察があります:配列( Map(LowCardinality(String), String)) CODEC(ZSTD( 1)) , INDEX idx_trace_id TraceId TYPE Bloom_filter(0.001) 粒度
11 、INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE Bloom_filter( 0.01 ) 粒度, INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE Bloom_filter( 0.01) 粒度 1, INDEX idx_span_attr_key mapKeys(SpanAttributes) TYPE Bloom_filter(
0.01 ) 粒度 1、INDEX idx_span_attr_value mapValues(SpanAttributes) TYPE Bloom_filter( 0.01
) 粒度 1, INDEX idx_duration Duration TYPE minmax GRANULARITY 1 ) エンジン =マージツリー パーティション BY toDate(タイムスタンプ) 注文 BY (サービス名、SpanName、toUnixTimestamp(
Timestamp), TraceId) TTL toDateTime(タイムスタンプ)) +
toIntervalDay( 3) 設定 index_granularity= 8192 、ttl_only_drop_parts = 1
![]()
[‘host.name’] ORDER BY スキーマの句が決定しますどうやって 情報はディスクにソートされて保存されます )。 これにより、スパースインデックスの構築[‘host.name’] そして、最も重要なことに、圧縮範囲に突然影響を与え、パフォーマンスから情報を求めます。 (ServiceName, SpanName, toUnixTimestampの現在節(タイムスタンプ), TraceId) 種類のレコードは左から左にゴージャスであり、最初に ServiceName でフィルタリングするクエリを最適化します。 後列列によるフィルター制限は、エクストラに変更され、エクストラは無効になります。 予測ワークフローの違いに起因してパターンへの安全な受け入れが変動する場合は、このテルと影響を受けやすい列も調整します。 これを行うときは、特定の キーは最適に活用されます. PARTITION BY – この句により、ディスク上のレコードが物理的に分離されます。 情報を効率的に削除するのに役立ちますが (以下のギャップ TTL)、潜在的に可能性があります 積極的にパフォーマンスからシーク情報に悪影響を及ぼします。 パーティション式 toDate(Timestamp) に対して、日ごとにパーティションを作成します、最新の情報に焦点を当てたクエリ、たとえば 24 時間の営業時間の終了時間は緩和されます。 多くのパーティション/日にわたるクエリ (デフォルトの 3 日間を超えて保持期間を拡大した場合に最も単純な可能性が最も高い) は、逆に悪影響を受ける可能性があります。 情報の保持期間を数か月または数年に拡大したり、より広い時間変動をターゲットにする必要があるパターンへの安全な入場をランク付けしたりする場合は、偶数式の枯渇を念頭に置いてください。年のTTLをランキングできます。 地図 – Map フォームは、上記の属性のスキーマ内で広範囲に影響を受けます。 これが選択されたのは、以下にリストされているキーが動的であり、ソフトウェア プログラムが明示的であるためです。 ここでの Map フォームの柔軟性は役に立ちますが、多少代償が伴います。 メソッド キーにアクセスするには、合計列を読み取ってロードする必要があります。 メソッドの最もプリンシパルにアクセスすると、この真実に起因して、最もプリンシパルがルートの明示的な列になった場合よりも大きな代償が発生します-特にメソッドが多くのキーで明確な場合. ここでのパフォーマンスの変動は、メソッドの次元に依存しますが、かなりのものになる可能性があります。 これに対処するために、ユーザーはおそらく無音になる可能性があります マテリアライズ[{‘message.id’:‘1’,‘message.type’:‘RECEIVED’},{‘message.id’:‘2’,‘message.type’:‘SENT’}] 最も絶え間なくメソッドのキー/価格のペアをルートの列にクエリしました。 これらは 実体化された列 、逆に、対応するメソッドの価格から INSERT 時間に入力され、すぐに安全に入場できるようになります。 以下に、最も重要な要素を具体化する例をビデオで示します ホスト名 マップ列 から*)ResourceAttributes をルート列に
ホスト:
テーブル otel_traces ( `タイムスタンプ` DateTime64(9 ) CODEC(Delta( 8), ZSTD( 1)), `HostName` String MATERIALIZED ResourceAttributes[‘host.name’], `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD( 1)), …. ) エンジン=MergeTree パーティション に 現在まで((タイムスタンプ) 注文 に (ServiceName, SpanName, toUnixTimestamp(タイムスタンプ), TraceId) TTL toDateTime( タイムスタンプ) + toIntervalDay(3 ) あるいは、これは偶然かもしれませんまた、情報が挿入されるとすぐに遡及的に適用され、パターンへの安全な入場が識別されます: ALTER テーブル otel_traces 追加 桁 HostName String MATERIALIZED ResourceAttributes[‘host.name’]; ALTER[{‘message.id’:‘1’,‘message.type’:‘RECEIVED’},{‘message.id’:‘2’,‘message.type’:‘SENT’}] テーブル otel_traces MATERIALIZE 桁 ホスト名;作成
このプロセスには、 である突然変異も必要です) I/O 集中型で、無音でスケジュールできる注意。 さらに、Map フォームでは、値が同じフォーム (この場合は String) である必要があります。 このフォーム情報の損失は、時間からシーク情報でキャストを必要とする場合があります。 さらに、ユーザーは、メソッド キーへのアクセスを確保するための重要な構文 (gape “Querying Traces”) を無意識のうちに知っている可能性があります。
ブルームフィルター – 制限付きの ORDER BY キーを修正するために、スキーマはいくつかの
情報スキップ ブルーム インデックス
。 これらは、マークの識別、マップ、または属性のキーによってフィルタリングするクエリを促進するように設計されています。 ほとんどの場合、重要なキーとフォーカスされた列/式の間に安定した相関関係が存在する場合、または価格がレコード内でひどくまばらである場合、セカンダリ インデックスは途方もないものになります。 これにより、この式に一致するフィルターを排出した後、 ディスク上のグラニュール現在目標価格が入っていない可能性が高い安価なランキングは飛ばされそうです。 私たちの明示的なスキーマでは、TraceId は非常にまばらであり、重要なキーの ServiceName と関連付けられている可能性があります。 同様に、属性のキーと値は、重要なキーの ServiceName 列と SpanName 列に関連付けられる可能性があります。 ほとんどの場合、これらをブルーム フィルターの実際の候補として割り当てます。 TraceId インデックスは非常に優れていますが、信頼できる世界のワークロードを下回る他のランキングは現在調査されていません。 このモデルのスケーラビリティを念頭に置いて、将来の実装に割り当てることができます。チューニングを停止してください!
コレクタパラメータの排出により ttl_days
、 ClickHouse の TTL パフォーマンスを通じて情報の有効期限を管理できます。 この価格は、式 TTL toDateTime( に反映されます。タイムスタンプ) + toIntervalDay(3) 、デフォルトは 3 です。 これよりも古いファイルは、非同期バックグラウンド プロセスに合わせて削除される可能性があります。 TTL、gape ここ.
上記のスキーマは PARTITION BY を支援するTTL。 特に、これにより、パラメーター
ttl_only_drop_parts=1。 上記で人気があるように、これはチャンスかもしれません クエリにプラスおよびマイナスの影響を与えます. クリティカルテーブルと同様に、 ClickHouse エクスポーターは am を作成します立体化された裂け目[{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] 。 具体化されたギャップは、ターゲット テーブルに正確に挿入されるため、SELECT シーク情報から情報を求める結果を小売店がアウトレットする特定のトリガーです。 このターゲット テーブルは、明示的なクエリ用に最適化された構造で情報 (集計の使い果たされたもの) を要約できます。 輸出者の場合、次のギャップが作成されます: 作成 マテリアライズド [{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] 意見 otel_traces_trace_id_ts_mv に otel_traces_trace_id_ts ( `TraceId` String, ` 始める` DateTime64(9)), `近い
` DateTime64( 9 ) ) として 選択する TraceId, 分
(タイムスタンプ) として 始める, 最大(タイムスタンプ) として 近い FROM otel_traces どこ TraceId !=
” グループ に TraceId この明示的な具体化された裂け目は GROUP BY TraceId および識別ごとの最大タイムスタンプと最小タイムスタンプの識別。 これは、テーブル に挿入されたすべての情報ブロック (場合によっては数百万行) に対して実行されます。 otel_traces
)。 この要約された情報は、逆に、ターゲット テーブル に正確に挿入されます。 otel_traces_trace_id_ts
。 以下のビデオでは、このテーブルのいくつかの行とそのスキーマを示しています:
選択する *
otel_traces_trace_id_ts LIMIT 5 ┌─ TraceId──────────────────────────┬──────────────────────── ───
から
はじまり:──┬──────────── ────────────────近い ─┐ │ 000040
cf204ee714c38565dd057f4d97│ 2023 -03
- 20 18 : 39 : 44.064898664 │ 2023 -03 -20
18:39 : 44.066019830 │ │ 00009 bdf67123e6d50877205680f14bf │ 2023 -03 -21 07: 56 : 30.185195776 │ 2023 -03-21 07: 56 :30.503208045 │ │
-03-20 18 : 310000c8e1e9f5f910c02a9a98aded04bd │ 202335.967373056 │ 2023 -03 -20 18[{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] : 31 : 35.968602368
c8e1e9f5f910c02a9a98aded04bd │ 2023 -03-20 18 : 31 : 36.032750972 │ 2023[{‘message.id’:‘1’,‘message.type’:‘RECEIVED’},{‘message.id’:‘2’,‘message.type’:‘SENT’}] -03-20 18: 31 : 36.032750972 │ │ 0000dc7a6d15c638355b33b3c6a8aaa2 ││ │00002023 -03 -21
31: 37.075681536 │ 2023-03)
00['host.name'] :
-21 )00: 31 : 37.247680719 │ └────────────────────────────────── ┴────────────────────────────────┴────────────────── ──────────────┘
), ZSTD( 1 )), INDEX idx_trace_id TraceId タイプ Bloom_filter(0.01) 粒度 1 ) エンジン5 rows[{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] の 空。 経過: 0.009
秒。 作成 テーブル otel_traces_trace_id_ts ( `TraceId` String CODEC(ZSTD( 1 )), `始める ` DateTime64(9) CODEC(Delta([{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] 8 ), ZSTD( 1 )), `近い` DateTime64(9) CODEC(Delta([] 8=MergeTree 注文
に (TraceId, toUnixTimestamp(Begin)) TTL toDateTime(始める)
+ toIntervalDay( 3)証明されているように、ターゲット テーブル otel_traces_trace_id_ts は [] を排気します(TraceId,toUnixTimestamp(Begin)) その ORDER BY 鍵。 これにより、ユーザーは明示的なマークの時間変動に迅速に名前を付けることができます.
以下の「トレースのクエリ」でこの具体化されたギャップの価格を調べますが、ランキングはつまずきましたTraceId ルックアップを実行するより広いクエリを高速化する上で、その価格はミニチュアです。 それにもかかわらず、ユーザーがインスピレーションを蓄積できる非常に正確な開始インスタンスを提供します. 顧客は、これを開発または規制することを好む可能性があります。具現化したギャップ。 ServiceName がマテリアライズド ビューに追加される可能性があります。集計とターゲット テーブルを使用して、トレース プロバイダーを迅速に識別できるようにします。 これは、コレクターをデプロイするか、または
ゲイプとテーブルを交互に編集して紹介します。 顧客は、サンプル要件への他の安全な入場に対処するために、重要なテーブルに一意のマテリアライズド ビューを結合することもできます。 見て 最近のブログ[{‘message.id’:‘1’,‘message.type’:‘RECEIVED’},{‘message.id’:‘2’,‘message.type’:‘SENT’}] 最後に、上記の機能は偶然にも可能性があります当たり確率も適用されますの排気投影 。 これらは具体化されたビューのすべての機能を提供するわけではありませんが、突然テーブル定義に含まれています。 マテリアライズド ビューとは異なり、プロジェクションは今と同じくらいアトミックにアップし、重要なテーブルに従って保持されます。ClickHouse は、時間から情報を求めて最適なバージョンをロボットで決定します。 輸出業者の医師は、非常に正確な初歩的な質問を提供します。 さらなるインスピレーションをご希望のお客様は、
までご相談ください。 以下で証明するダッシュボード内のクエリ 。 トレースを照会する際の重要な概念について: TraceId look-united states of americaon the critical
otel_traces テーブルは、ブルーム フィルターにもかかわらず、コストがかかる可能性があります。 また、明示的なマークotel_traces_trace_id_ts
テーブル:) テーブルは、上記の一般的なように、マークの時刻が変動する可能性がある可能性があります。 この時間変動は、
otel_traces
テーブル。 ORDER BY キー内のタイムスタンプ。 ServiceName がフィルターとしてシーク情報 from に適用される場合、シーク情報 from はおそらくさらに最適化されます (ただし、これは明示的なプロバイダーからのスパンに限定される可能性があります)。 以下のバリアントからの 2 つのシーク情報とそれぞれのタイミングを念頭に置いてください。これらはすべて、予感に関連するスパンを返します。最も簡単な使い方 otel_traces
選択する タイムスタンプ 、TraceId、SpanId、SpanName から otel_traces WHERE
TraceId = '0f8a2c02d77d65da6b2c4d676985b3ab'注文 に タイムスタンプ ASC [{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] 50 rows
宇宙で。 経過: 0.197
秒。 処理済み298.77 千選択する max (近い) +rows 、 17.39
MB (1.51 百万 rows/s., 88.06 MB[{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] /s.) 悪用する場合 otel_traces_trace_id_ts テーブルと結果のインスタンスを排出してフィルターを排出する:
と
(始める)) から otel_traces_trace_id_ts どこ TraceId=trace_id ) として'0f8a2c02d77d65da6b2c4d676985b3ab'
として trace_id, ( 選択する 分
開ける
, (
1 から otel_traces_trace_id_ts どこ TraceId=trace_id ) として 殺す )選択する タイムスタンプ、TraceId、SpanId、SpanName から otel_traces どこ (TraceId=trace_id) [{'message.id':'1','message.type':'RECEIVED'},{'message.id':'2','message.type':'SENT'}] と (タイムスタンプ )>=開ける) と ( タイムスタンプ <= 殺す) 注文 に タイムスタンプ ASC 50 rows
の 空。 経過: 0.110 秒。 処理済み
225.05 千 rows, 12.78 MB (2.05 百万 行/さん、116.52 MB/s.)
ここでの私たちの情報量はごくわずかです (球状の 200m スパンと 125GB の情報)。であるため、絶対的なタイミングと差異は低くなります。 これらの違いをより大きなデータセットで拡大するように求めているのに対し、私たちの試みは、この具体化されたギャップが最も単純で中程度のスピードアップをもたらすことを示唆しています (読み取られた行の小さな違いを示しています) - Timestamp 列は の 3 番目のキーであるため、驚くことではありません𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺