著者:ジャックス
序文
運用・保守プロセスの実用化では、我々は、私たちは自分のアプリケーションの動作状態の完全な理解を持たせるために多くのロギングとモニタリングを必要としています。しかし、ほとんどの開発者のために、通常我々がより懸念しているが、よりエレガントなビジネスを実現するために、またはどのようにアプリケーション監視のために、符号化技術に関連したなどのアプリケーションより速い応答速度を、作る方法ですまだログファイルのレベルのまま、ほとんどの事故が発見された後の男の外にあり、問題ログを検索してみてください。
この記事では、等SQLレコードのシステム応答時間、異常な、EFの実行、などの監視アプリケーションのためのインジケータのセットであり、これらのレコードは、照会を容易にするために、追跡可能なリンクに編成することができる弾性APMの調製を記載します。また、弾性APMはまた、私たちが問題を見つけ、識別しやすいように、Kibanaで非常に素晴らしい視覚的な表示を行うことができます。
ナンセンスはこれ以上言う、我々は〜戦闘を開始していません
弾性APMはじめに
以下に示すように、構成される、次の4つの成分による弾性APM:
APMエージェント
APMエージェントがNugetバッグあなたの.NETのコアプログラムにインストールされている、彼はパフォーマンス、エラーや他のタイプのデータを収集するために使用され、データはAPMサーバーに送信され、キャッシュされたバッチを収集します。もちろん、.NETのコアパッケージNugetの使用に加えて、彼はまた、などのJava、Node.jsの、パイソン、他の多くの言語をサポート
ここではサポートされている言語のリストを参照してください。https://www.elastic.co/guide/en/apm/agent/index.html
APMサーバー
APM Serverは、受信側のアプリケーションエージェントの着信データパケットのためのサーバー上に展開され、自動的に弾性サーバへのデータパケットに基づいて、文書、転送データを作成しています。
弾性検索
私は、大量のデータを検索し、分析し、彼は急速に、リアルタイムストレージ用の高性能実装のLuceneベース、分散型全文検索エンジンで、我々はすべてに精通していると信じています。ここで話して、彼はデータの格納と検索機能を提供します!
Kibana
あなたは、あなたがどのように多くのKibanaを理解し、弾性検索に精通している場合、Kibanaは、オープンソースの解析と可視化プラットフォームは、彼はあなたの迅速な視覚的記憶に弾性検索でデータを支援するために弾性検索良い相乗効果を続けていくことが可能であり、作られましたように美しいレポート、グラフ、およびさまざまな。
環境の準備
この戦闘の過程で、我々は次のものが必要になります。
- 弾性検索
- Kibana
- APMサーバー
- .NET標準2.0 +ベースのプロジェクト
弾性検索のインストール:https://www.cnblogs.com/baiyunchen/p/11227144.html
Kibanaのインストール:
私の環境はCentOSに7であるので、以下のhttps://www.elastic.co/guide/en/kibana/7.3/rpm.html 公式サイトのチュートリアルのインストール、全体のプロセスは非常に簡単です:
- (このようにyumをインストール速度が遅すぎるので、私はサンダーがLinuxマシンにアップロードし、完全なrpmファイルをダウンロードし使用しているとのため)Kibana RPMパッケージをダウンロードしてください
- インストールするには、「ファイル名をダウンロードするには、」コマンドrpm --installを実行します
- インストールが完了したら、/etc/kibana/kibana.ymlファイルは、ファイルの末尾に次の設定を追加します:
server.host:0.0.0.0 server.name:ホストのIP はserver.port:あなたが好きなポート番号 elasticsearch.hostsを:[ "良いESアドレスがインストールされている、複数の間にカンマを使用する"] logging.dest: /var/log/kibana.log //が作成され、このファイルを進める必要があり、その後に十分な権限
- Kibanaは、システムサービスと起動してインストール
sudoを/ binに/ systemctlデーモンリロード にsudo / binに/ systemctl kibana.serviceの有効 sudoをkibana.serviceを開始systemctl
ここでは、注目弾性検索エディションを支払わなければならないとKibanaは一致しなければならない、またはエラーになります。(I ESは、いくつかの時間前にインストールされているので、あなたは息のすべてをインストールする場合に問題があるだろう、それは何も問題がなければなりません)
あなたは問題がある場合は、残念ながら、あなたはlogging.dest構成されたパス構成でログファイルを表示することができます。
APM Serverのインストール
次のようにインストールKibana同様のプロセスでAPM Serverのインストールは、次のとおりです。
- RPMパッケージをダウンロードし、パッケージには、あなたが必要とするページのこのバージョンでは見つけることが、また、ES、一貫したKibanaバージョンと話をする必要がある、またはあなたが知っている〜 https://www.elastic.co/cn/downloads/past-releases#apm-server
- インストールするには、「ファイル名をダウンロードするには、」回転数を--install実行
- 開始の設定ファイルをホストする、APM-server.ymlフォルダの/ etc /アンプ・サーバーの構成ファイルを変更します。「localhostを:8200」が「0.0.0.0:8200」に変更、彼はIPを許可することができますように。アクセスポート番号、および最終的な表面形状で次の設定を追加します:
output.elasticsearch: ホスト:[「コンマで区切られた複数の設備の良好なESアドレスを持っています」]
- APM-サーバーはシステムサービスと起動してインストールされています
sudoを/ binに/ systemctlデーモンリロード にsudo / binに/ systemctl APM-server.serviceの有効 sudoはAPM-server.serviceを開始systemctl
上記の操作が完了すると、ブラウザが開くしようと実行した後、サーバーIP:8200を、最終的にはAPM Serverのインストールは問題ありません場合は、ブラウザは、次のような内容を出力します:
{ "ビルド日付": "2019-06-20T14:39:23Z"、 "build_sha": "9a099b63c53eac8c55707df96193143ec66337e9"、 "バージョン": "7.2.0" }
この時点では、ブラウザでKibanaを開き、APMを追加]をクリックします
そして、新しく開いたページをスクロールダウンし、あなたが正しくセットアップAPM Serverがインストールが完了したことを示すだろうしている場合は、APMサーバステータスボタンをチェック]をクリックします -
この時点まで、私たちのインストール作業は、次を完了し、我々は〜それを続け、弾性APMとの統合.NETのコアにしてみてください
.NETのコアアプリケーションの統合
私たちは、APMの様々な機能をテストするためのデモプログラムを作成します。
プロジェクトのGitHubのに対処するために参照してください。
リファレンスの依存関係
私たちは、実際に、それは我々がNugetにおけるAPMエージェントの一部は、我々が引用することを言った非常に最初に参照され、私たちのアプリケーションとの統合を行うにはNugetから関連SDKを参照する必要がElastic.Apm.NetCoreAllこのパッケージを。
このパッケージには、必要に応じて、あなたはそれの一部のみに頼ることができ、同等の自動従属以下の3つのパッケージに依存しています。
ここでは単純化のために、このパッケージは、直接Elastic.Apm.NetCoreAllで印刷します
.NETのコアエージェントに追加します
.NETのコアスタートアップファイルを見つけ、中に以下のコードの設定方法を追加します。
公共の無効設定(IApplicationBuilderアプリ、IHostingEnvironment ENV) { app.UseAllElasticApm(構成); }
その後にapplication.jsonに以下を追加します。
{ "ElasticApm":{ "LogLevelを": "エラー"、//ログレベル、 "ServerUrls"を設定し、彼らのニーズに応じて: "のhttp:// localhostを:8200"、// インストールAPMサーバーURLの前に設置され、デフォルトのポート番号は8200である 「MyAppの」、//アプリケーション名、ライン上の実際の状況を開始し、その後、使用可能な文字:. AZ、AZ:「のServiceName」 、0-9、 - 、_、およびスペースのデフォルトはのエントリの集合体でありますファイルアプリケーション } }
この時点で、私たちは、わずか数回を更新し、プロジェクトを起動します、その後Kibanaに戻り、以前のページにスクロールダウンし、.NETを選択し、[エージェントステータス]ボタンを確認]をクリックし、成功した場合は、データが正常に受信」と表示されます「一の以上の薬剤から、残念ながらこれらの単語を示すことができなかった場合は、診断ツールによってVSイベントの追跡中と何も設定ません場所を確認
監視データを表示
あなたはAPMデータを入力するためのページを表示することができ、その後、APMダッシュボード]ボタンをクリックして、インデックスを作成するために、Kibanaオブジェクトをロード見つけるために、ページの下部KibanaでAPMを追加します。
次のようにページを表示するには、APMダッシュボード]ボタンをクリックします。
ページは、機能・サービスに分けて、二つの大きな機能ブロックのトレースは、最初に対応する機能でこれらの二つのタブページで簡単に見てみましょう。
サービス
XianDotnetCommunityは、コンフィギュレーションファイルのServiceNameに実際にご使用の構成で、入力するには、名前をクリックすると、以下のリストに示されている、とあなたは以下のレポート、そこ取引、エラー、メトリック3つのタブページを見ることができます。
間で
トランザクション:、長い時間を含む要求、要求応答の場合には、現在のアプリケーションの概要を示しているコールの数、およびそう要求
例外リストプログラム:エラー
メトリック:CPUアプリケーションマシン/メモリ使用量
PS:実は、私は、消費アプリケーションメモリとCPUの現在値が非常に必要だと思うが、それは、これらの機能を実装することの将来の更新を楽しみにしていないエージェントの.NETのコアバージョンのように見えます
形跡
内部リンクのトラッキング・ビュー・ホームすべてのトランザクション応答時間を含みません名前のリストです
あなたがボトルネックリンクの分析に役立つリンクと情報のいくつかに、より詳細な応答のリストをこのトランザクションを見ることができ、中に特定の取引をクリックして、より多くの我々は、以下に詳細に入ります。
詳細をみます
弾性APMようなリンクの追跡など、多くの他の特徴は、ありますが、データベースは〜のは、それを一緒に探検しましょう、実行するために呼び出します
モニタリングAPIコールトラッキングリンク
あなたはマイクロサービスアーキテクチャについて調べる場合は、リンクトラッキングの概念を理解する必要があります。それを追跡するためのリンクは何ですか?栗の場合:
そこにサービスが、彼はサービスB、Cに依存し、BサービスはサービスD、Eに依存し、CサービスはF、Gに依存サービスがあることが非常に遅くなり、そして、その後1日、(多数の依存関係を省略)最終的にどのようにそれを遅くしているサービスを見つけるには?このとき、最終的なリンクは便利です -
のは、このネストされたコールの簡単なシミュレーションを見てみましょう:
DEMO1 WebAPIのは、彼がB / C / D / E.で別のプログラムDEMO2ウェブAPIインターフェースを呼び出すAPIのAを有するConsumerControllerを有し、一つのプロジェクトで コードは以下の通りであります:
プロジェクトA:
[ルート( "API /消費者")] [ApiController] パブリッククラスConsumerController:ControllerBase { プライベート読み取り専用IHttpClientFactory _httpClientFactory。 公共ConsumerController(IHttpClientFactory httpClientFactory) { //使用HttpClientFactory时先在スタートアップ中调用services.AddHttpClient(需要)。 _httpClientFactory = httpClientFactory。 } 民間のconst文字列BASEURI = "のhttp:// localhostを:54597"; [HTTPGET( "A")] パブリックタスク非同期<ストリング> A() { //のHttpClientクライアント=新しいHttpClientを()。 VARクライアント= _httpClientFactory.CreateClient(); Thread.sleep(新しいランダム()次(1、1500)。); VaRのB =待つclient.GetStringAsync($ "{BASEURI} / API /データソース/ B")。 VAR cは= client.GetStringAsync($ "{BASEURI} / API /データソース/ C")を待ちます。 VAR Dは= client.GetStringAsync($ "{BASEURI} / API /データソース/ D")を待ちます。 VAR Eは= client.GetStringAsync($ "{BASEURI} / API /データソース/ E")を待ちます。 $ "B = {B}&C = {C}&D = {D}&E = {E}を"を返します。 } }
プロジェクトB:
[ルート( "API /データソース")] [ApiController] パブリッククラスDataSourceController:ControllerBase { [HTTPGET( "B")] パブリック非同期タスクの<string> B() { 。のThread.sleep(新しいランダム()次( 1、1500))。 「B」を返します。 } [HTTPGET( "C")] パブリックタスクの<string> C()非同期 { のThread.sleep(新しいランダム()次に(1、1500)。)。 「C」を返します。 } [HTTPGET( "D")] パブリック非同期タスクの<string> D() { のThread.sleep(新しいランダム()次に(1、1500)。)。 「D」を返します。 Thread.sleep(新しいランダム()次(1、1500)。); 「E」を返します。 } }
この時点で、我々はAPI A(xxxは/ API /消費者/ A)DEMO1を要求し、トレースKibanaでAPMを開き、「コンシューマー/ GET」このレコードは、(デフォルトの名前はコントローラ+アクションに基づいているに見える見つけます命名)、その後、詳細の表示をクリックします。
詳細の下で、我々はタイムラインを見つけ、あなたは、以下に示すグラフィックを見ることができます:
私たちは、それぞれ、我々は要求API Aで時間を過ごすことがわかりますAPI 4を呼び出す時には、三度目のAPI呼び出しに時間がかかることがわかる、あなたは詳細な情報が要求され見ることができます青いバーをクリックしてください。
ここでは少し良いデフォルトの名前のショーはlocalhostのようにGETされ、実際には、我々は正しい、APIのURI呼び出しとして表示されている期待しますか?私たちは見ることができ、それらにPRを与えるために、これを言及:https://github.com/elastic/apm-agent-dotnet/pull/463
EFモニタ実行記録
次のようにEFは、パフォーマンスの問題を検出するために、DBの操作、監視を実行したとき、これは、つまり、あまりにも多くの説明を必要としない、私のコードは次のようになります。
[HTTPGET( "人物")] ます。public void TestEfCore() { 使用して(VAR新しい新しいApmDbContext DB =()) { VAR新しいJAX新しいは人= { NAME = "西の.NETコミュニティ"、 年齢= 26であり、 備考、=「ベストを尽くすを技術コミュニティ〜 " }; db.Persons.Add(JAX); db.SaveChanges(); db.Persons.FirstOrDefault(X => == x.Id jax.Id); db.Persons.FirstOrDefault(X => x.Name == "Xiの.NETコミュニティ"); jax.Name = ".NETコミュニティ西"; db.SaveChanges(); db.Persons.Remove(JAX); db.SaveChanges(); } }
私たちはこの要求を表示Kibanaを使用すると、タイムラインは以下の通りであります:
私たちは、視覚的に非常に有用であったものをSQL文、私たちの要求分析の各消費する多くを、行う、この要求に明確に見ることができます。あなたはより詳細なデータを見ることができ、特定の青いバーをクリックして、より多くの残念なことに、SQLのparamsを記録していないデータは、そのために私たちは、それが十分に友好的ではなかった、完全にこの要求を再現したいと思います -
埋没自身の記録
比較的弾性APMのエコシステムは、現在、十分ではない、話す、またはあなたは、自分の必然的に埋もれたレコードのパフォーマンスデータの一部を行う、またはサードパーティのコンポーネントとして、クラス、弾性APMを使用したい場合は、いくつかのサポートコンポーネントを歩く天空よりわずかに小さいですライブラリはサポートしていますが、また、いくつかの埋葬ポイントデータを実行する必要があります。その後、我々は我々の要求に応じて、我々は次のようにサンプルコードで記録された付加情報の一部を埋めるようにしたいです:
【HTTPGET】 公共ボイドRecordMyApmData() { VARトランザクション= Agent.Tracer.CurrentTransaction。 VAR SPAN1 = transaction.StartSpan( "ステージ1"、 "カスタマイズ"); Thread.sleep(300)。 span1.End(); Thread.sleep(200)。 VAR SPAN2 = transaction.StartSpan( "ステージ2"、 "カスタマイズ")。 Thread.sleep(100)。 span2.End(); Thread.sleep(100)。 VAR span3 = transaction.StartSpan( "ステージ3"、 "カスタマイズ")。 Thread.sleep(500)。 span3.End(); }
次のように最後に記録された結果は以下のとおりです。
デモ〜書き込みは非常にシンプルですが、私は、あなたはおそらく、彼らはキャプチャする必要が監視データの一部をカスタマイズするには、このクラスを使用する方法脳弾性APMエージェントを構成することができたと確信しているものの、
例外監視
私たちのプログラム例外が発生した場合、弾性APMは、あなたがこの機能を記録し、同様のログ助けることができますが、少し小さなログよりも使いやすいかもしれません。我々は〜それを見ています
次のようにサンプル・コードは次のとおりです。
[HTTPGET] 公共ボイドTestException() { 試み { スロー新しい新しい例外(「例外キャプチャ」); } キャッチ(例外) { } スロー新しい新しい例外(「キャッチされない例外」); }
コードを実行した後、我々は、サービス名に例外をクリックすると、[エラー]タブページで見ることができます
詳細をクリックして、我々は、詳細なコールスタック情報を見ることができます:
また、我々はTrasactionsタブは、要求された例外が発生見つけ、その後、詳細に内容を表示するにはクリックすることができ、私たちは、この例外が発生した見ることができます:
概要
この記事では、.NETのコアアプリケーションのパフォーマンスと異常なデータに集め弾性APMを使用して、Kibana視覚的な分析を使用する方法について説明し、全体的に、弾性APMは、パフォーマンス監視のために、リンクトラッキングはかなり強かった例外監視は基本的に十分です私が使用しています。
今のところ、弾性APMサポートコンポーネント、また、データベースクエリとして、まだEFコアのための唯一のサポートは比較的限られている以上のコンポーネントをサポートしていません、HTTPリクエストを追跡するために追跡リンクはサポートされていますが、他の方法では役に立たないサポートされています。また、私はまた、非常に悲しい、異常監視警報である弾性APMは、X-パックのパッケージに充電するアラーム(ウォッチャー)を監視するためだと思うが、それはまだ非常に重要です。
探検する弾性APM、問題領域を試すへようこそ -