Python アプリケーション用に Azure Monitor をセットアップする (プレビュー)Set up Azure Monitor for your Python application (preview)

Azure Monitor は、OpenCensus との統合により、Python アプリケーションの分散トレース、メトリック収集、およびログ記録をサポートします。Azure Monitor supports distributed tracing, metric collection, and logging of Python applications through integration with OpenCensus. この記事では、OpenCensus for Python を設定し、監視データを Azure Monitor に送信するプロセスについて説明します。This article will walk you through the process of setting up OpenCensus for Python and sending your monitoring data to Azure Monitor.

前提条件Prerequisites

  • Azure サブスクリプション。An Azure subscription. Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。If you don't have an Azure subscription, create a free account before you begin.
  • Python のインストール。Python installation. この記事では Python 3.7.0 を使用していますが、以前のバージョンでも軽微な変更で使用できる可能性があります。This article uses Python 3.7.0, though earlier versions will likely work with minor changes.

Azure portal にサインインするSign in to the Azure portal

Azure portal にサインインするSign in to the Azure portal.

Azure Monitor で Application Insights のリソースを作成するCreate an Application Insights resource in Azure Monitor

まず、インストルメンテーション キー (ikey) を生成する Application Insights リソースを Azure Monitor で作成する必要があります。First you have to create an Application Insights resource in Azure Monitor, which will generate an instrumentation key (ikey). 次に、この ikey を使用して、Azure Monitor にテレメトリ データを送信する OpenCensus SDK を構成します。The ikey is then used to configure the OpenCensus SDK to send telemetry data to Azure Monitor.

  1. [リソースの作成] > [開発者ツール] > [Application Insights] の順に選択します。Select Create a resource > Developer tools > Application Insights.

    Application Insights リソースを追加する

  2. 構成ボックスが表示されます。A configuration box appears. 下の表を使用して、入力フィールドに入力します。Use the following table to fill out the input fields.

    設定Setting Value [説明]Description
    NameName グローバルに一意の値Globally unique value 監視しているアプリを識別する名前。Name that identifies the app you're monitoring
    リソース グループResource Group myResourceGroupmyResourceGroup Application Insights データをホストする新しいリソース グループの名前Name for the new resource group to host Application Insights data
    LocationLocation East USEast US お近くの場所か、アプリがホストされている場所の近くA location near you, or near where your app is hosted
  3. 作成 を選択します。Select Create.

Azure Monitor 用の OpenCensus Python SDK を使用したインストルメント化Instrument with OpenCensus Python SDK for Azure Monitor

OpenCensus Azure Monitor エクスポーターをインストールします。Install the OpenCensus Azure Monitor exporters:

python -m pip install opencensus-ext-azure

パッケージと統合の完全な一覧については、OpenCensus パッケージに関するページを参照してください。For a full list of packages and integrations, see OpenCensus packages.

注意

python -m pip install opencensus-ext-azure コマンドは、Python インストール用に PATH 環境変数が設定されていることを前提としています。The python -m pip install opencensus-ext-azure command assumes that you have a PATH environment variable set for your Python installation. この変数を構成していない場合は、Python の実行可能ファイルの場所を示す完全なディレクトリ パスを指定する必要があります。If you haven't configured this variable, you need to give the full directory path to where your Python executable is located. その結果次のようなコマンドになります。C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\python.exe -m pip install opencensus-ext-azureThe result is a command like this: C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\python.exe -m pip install opencensus-ext-azure.

SDK では 3 つの Azure Monitor エクスポーターを使用して、さまざまな種類のテレメトリ (トレース、メトリック、ログ) を Azure Monitor に送信します。The SDK uses three Azure Monitor exporters to send different types of telemetry to Azure Monitor: trace, metrics, and logs. これらのテレメトリの種類の詳細については、データ プラットフォームの概要に関するページを参照してください。For more information on these telemetry types, see the data platform overview. 次の手順に従い、3 つのエクスポーターを使用してこれらのテレメトリの種類を送信します。Use the following instructions to send these telemetry types via the three exporters.

テレメトリの種類のマッピングTelemetry type mappings

次に、Azure Monitor に表示されるテレメトリの種類にマップされる OpenCensus のエクスポーターを示します。Here are the exporters that OpenCensus provides mapped to the types of telemetry that you will see in Azure Monitor.

OpenCensus から Azure Monitor へのテレメトリの種類のマッピングを示すスクリーンショット

TraceTrace

注意

OpenCensus の Trace分散トレースを表します。Trace in OpenCensus refers to distributed tracing. AzureExporter によって requests および dependency テレメトリが Azure Monitor に送信されます。The AzureExporter sends requests and dependency telemetry to Azure Monitor.

  1. まずいくつかのトレース データをローカルで生成しましょう。First, let's generate some trace data locally. Python IDLE か任意のエディターで、次のコードを入力します。In Python IDLE, or your editor of choice, enter the following code.

    from opencensus.trace.samplers import ProbabilitySampler
    from opencensus.trace.tracer import Tracer
    
    tracer = Tracer(sampler=ProbabilitySampler(1.0))
    
    def valuePrompt():
        with tracer.span(name="test") as span:
            line = input("Enter a value: ")
            print(line)
    
    def main():
        while True:
            valuePrompt()
    
    if __name__ == "__main__":
        main()
    
  2. このコードを実行すると、値を入力するように繰り返し求められます。Running the code will repeatedly prompt you to enter a value. 入力ごとに値はシェルに出力され、OpenCensus Python Module が SpanData の対応する部分を生成します。With each entry, the value will be printed to the shell, and the OpenCensus Python Module will generate a corresponding piece of SpanData. OpenCensus プロジェクトでは、複数範囲のツリーとしてトレースが定義されます。The OpenCensus project defines a trace as a tree of spans.

    Enter a value: 4
    4
    [SpanData(name='test', context=SpanContext(trace_id=8aa41bc469f1a705aed1bdb20c342603, span_id=None, trace_options=TraceOptions(enabled=True), tracestate=None), span_id='15ac5123ac1f6847', parent_span_id=None, attributes=BoundedDict({}, maxlen=32), start_time='2019-06-27T18:21:22.805429Z', end_time='2019-06-27T18:21:44.933405Z', child_span_count=0, stack_trace=None, annotations=BoundedList([], maxlen=32), message_events=BoundedList([], maxlen=128), links=BoundedList([], maxlen=32), status=None, same_process_as_parent_span=None, span_kind=0)]
    Enter a value: 25
    25
    [SpanData(name='test', context=SpanContext(trace_id=8aa41bc469f1a705aed1bdb20c342603, span_id=None, trace_options=TraceOptions(enabled=True), tracestate=None), span_id='2e512f846ba342de', parent_span_id=None, attributes=BoundedDict({}, maxlen=32), start_time='2019-06-27T18:21:44.933405Z', end_time='2019-06-27T18:21:46.156787Z', child_span_count=0, stack_trace=None, annotations=BoundedList([], maxlen=32), message_events=BoundedList([], maxlen=128), links=BoundedList([], maxlen=32), status=None, same_process_as_parent_span=None, span_kind=0)]
    Enter a value: 100
    100
    [SpanData(name='test', context=SpanContext(trace_id=8aa41bc469f1a705aed1bdb20c342603, span_id=None, trace_options=TraceOptions(enabled=True), tracestate=None), span_id='f3f9f9ee6db4740a', parent_span_id=None, attributes=BoundedDict({}, maxlen=32), start_time='2019-06-27T18:21:46.157732Z', end_time='2019-06-27T18:21:47.269583Z', child_span_count=0, stack_trace=None, annotations=BoundedList([], maxlen=32), message_events=BoundedList([], maxlen=128), links=BoundedList([], maxlen=32), status=None, same_process_as_parent_span=None, span_kind=0)]
    
  3. 値の入力はデモとしても有用ですが、最終的には SpanData を Azure Monitor に送信するようにします。Although entering values is helpful for demonstration purposes, ultimately we want to emit the SpanData to Azure Monitor. 前の手順のコードを、次のコード サンプルに基づいて変更します。Modify your code from the previous step based on the following code sample:

    from opencensus.ext.azure.trace_exporter import AzureExporter
    from opencensus.trace.samplers import ProbabilitySampler
    from opencensus.trace.tracer import Tracer
    
    # TODO: replace the all-zero GUID with your instrumentation key.
    tracer = Tracer(
        exporter=AzureExporter(
            connection_string='InstrumentationKey=00000000-0000-0000-0000-000000000000'),
        sampler=ProbabilitySampler(1.0),
    )
    
    def valuePrompt():
        with tracer.span(name="test") as span:
            line = input("Enter a value: ")
            print(line)
    
    def main():
        while True:
            valuePrompt()
    
    if __name__ == "__main__":
        main()
    
  4. Python スクリプトを実行すると引き続き値を入力するように求められますが、値のみがシェルに出力されます。Now when you run the Python script, you should still be prompted to enter values, but only the value is being printed in the shell. 作成された SpanData は Azure Monitor に送信されます。The created SpanData will be sent to Azure Monitor. 送信されたスパン データは dependencies で確認できます。You can find the emitted span data under dependencies.

  5. OpenCensus のサンプリングの詳細については、OpenCensus でのサンプリングに関するページを参照してください。For information on sampling in OpenCensus, take a look at sampling in OpenCensus.

  6. トレース データにおけるテレメトリの相関付けの詳細については、「OpenCensus Python におけるテレメトリの相関付け」を参照してください。For details on telemetry correlation in your trace data, take a look at OpenCensus telemetry correlation.

メトリックMetrics

  1. まず、いくつかのローカル メトリック データを生成しましょう。First, let's generate some local metric data. ユーザーが Enter キーを押した回数を追跡する単純なメトリックを作成します。We'll create a simple metric to track the number of times the user presses Enter.

    from datetime import datetime
    from opencensus.stats import aggregation as aggregation_module
    from opencensus.stats import measure as measure_module
    from opencensus.stats import stats as stats_module
    from opencensus.stats import view as view_module
    from opencensus.tags import tag_map as tag_map_module
    
    stats = stats_module.stats
    view_manager = stats.view_manager
    stats_recorder = stats.stats_recorder
    
    prompt_measure = measure_module.MeasureInt("prompts",
                                               "number of prompts",
                                               "prompts")
    prompt_view = view_module.View("prompt view",
                                   "number of prompts",
                                   [],
                                   prompt_measure,
                                   aggregation_module.CountAggregation())
    view_manager.register_view(prompt_view)
    mmap = stats_recorder.new_measurement_map()
    tmap = tag_map_module.TagMap()
    
    def prompt():
        input("Press enter.")
        mmap.measure_int_put(prompt_measure, 1)
        mmap.record(tmap)
        metrics = list(mmap.measure_to_view_map.get_metrics(datetime.utcnow()))
        print(metrics[0].time_series[0].points[0])
    
    def main():
        while True:
            prompt()
    
    if __name__ == "__main__":
        main()
    
  2. このコードを実行すると、Enter キーを押すように繰り返し求められます。Running the code will repeatedly prompt you to press Enter. Enter キーが押された回数を追跡するメトリックが作成されます。A metric is created to track the number of times Enter is pressed. 各エントリに対して値がインクリメントされ、メトリック情報がコンソールに表示されます。With each entry, the value will be incremented and the metric information will be displayed in the console. この情報には、メトリックが更新されたときの現在の値と現在のタイムスタンプが含まれます。The information includes the current value and the current time stamp when the metric was updated.

    Press enter.
    Point(value=ValueLong(5), timestamp=2019-10-09 20:58:04.930426)
    Press enter.
    Point(value=ValueLong(6), timestamp=2019-10-09 20:58:06.570167)
    Press enter.
    Point(value=ValueLong(7), timestamp=2019-10-09 20:58:07.138614)
    
  3. 値の入力はデモとしても有用ですが、最終的にはメトリック データを Azure Monitor に送信するようにします。Although entering values is helpful for demonstration purposes, ultimately we want to emit the metric data to Azure Monitor. 前の手順のコードを、次のコード サンプルに基づいて変更します。Modify your code from the previous step based on the following code sample:

    from datetime import datetime
    from opencensus.ext.azure import metrics_exporter
    from opencensus.stats import aggregation as aggregation_module
    from opencensus.stats import measure as measure_module
    from opencensus.stats import stats as stats_module
    from opencensus.stats import view as view_module
    from opencensus.tags import tag_map as tag_map_module
    
    stats = stats_module.stats
    view_manager = stats.view_manager
    stats_recorder = stats.stats_recorder
    
    prompt_measure = measure_module.MeasureInt("prompts",
                                               "number of prompts",
                                               "prompts")
    prompt_view = view_module.View("prompt view",
                                   "number of prompts",
                                   [],
                                   prompt_measure,
                                   aggregation_module.CountAggregation())
    view_manager.register_view(prompt_view)
    mmap = stats_recorder.new_measurement_map()
    tmap = tag_map_module.TagMap()
    
    # TODO: replace the all-zero GUID with your instrumentation key.
    exporter = metrics_exporter.new_metrics_exporter(
        connection_string='InstrumentationKey=00000000-0000-0000-0000-000000000000')
    
    view_manager.register_exporter(exporter)
    
    def prompt():
        input("Press enter.")
        mmap.measure_int_put(prompt_measure, 1)
        mmap.record(tmap)
        metrics = list(mmap.measure_to_view_map.get_metrics(datetime.utcnow()))
        print(metrics[0].time_series[0].points[0])
    
    def main():
        while True:
            prompt()
    
    if __name__ == "__main__":
        main()
    
  4. エクスポーターは、一定の間隔でメトリック データを Azure Monitor に送信します。The exporter will send metric data to Azure Monitor at a fixed interval. 既定値は 15 秒ごとです。The default is every 15 seconds. 1 つのメトリックを追跡しているので、このメトリック データは、それに含まれる値およびタイムスタンプに関係なく、間隔ごとに送信されます。We're tracking a single metric, so this metric data, with whatever value and time stamp it contains, will be sent every interval. データは customMetrics で確認できます。You can find the data under customMetrics.

ログLogs

  1. まず、いくつかのローカル ログ データを生成しましょう。First, let's generate some local log data.

    import logging
    
    logger = logging.getLogger(__name__)
    
    def valuePrompt():
        line = input("Enter a value: ")
        logger.warning(line)
    
    def main():
        while True:
            valuePrompt()
    
    if __name__ == "__main__":
        main()
    
  2. コードにより、値の入力を継続的に求められます。The code will continuously ask for a value to be entered. 入力したすべての値に対してログ エントリが生成されます。A log entry is emitted for every entered value.

    Enter a value: 24
    24
    Enter a value: 55
    55
    Enter a value: 123
    123
    Enter a value: 90
    90
    
  3. 値の入力はデモとしても有用ですが、最終的にはログ データを Azure Monitor に送信するようにします。Although entering values is helpful for demonstration purposes, ultimately we want to emit the log data to Azure Monitor. 前の手順のコードを、次のコード サンプルに基づいて変更します。Modify your code from the previous step based on the following code sample:

    import logging
    from opencensus.ext.azure.log_exporter import AzureLogHandler
    
    logger = logging.getLogger(__name__)
    
    # TODO: replace the all-zero GUID with your instrumentation key.
    logger.addHandler(AzureLogHandler(
        connection_string='InstrumentationKey=00000000-0000-0000-0000-000000000000')
    )
    
    def valuePrompt():
        line = input("Enter a value: ")
        logger.warning(line)
    
    def main():
        while True:
            valuePrompt()
    
    if __name__ == "__main__":
        main()
    
  4. エクスポーターはログ データを Azure Monitor に送信します。The exporter will send log data to Azure Monitor. データは traces で確認できます。You can find the data under traces.

注意

このコンテキストでの tracesTracing と同じではありません。traces in this context is not the same as Tracing. traces は、AzureLogHandler を利用するときに Azure Monitor に表示されるテレメトリの種類を表します。traces refers to the type of telemetry that you will see in Azure Monitor when utilizing the AzureLogHandler. Tracing は OpenCensus の概念を表し、分散トレースに関連します。Tracing refers to a concept in OpenCensus and relates to distributed tracing.

  1. ログ メッセージの書式を設定するには、組み込みの Python ログ APIformatters を使用します。To format your log messages, you can use formatters in the built-in Python logging API.

    import logging
    from opencensus.ext.azure.log_exporter import AzureLogHandler
    
    logger = logging.getLogger(__name__)
    
    format_str = '%(asctime)s - %(levelname)-8s - %(message)s'
    date_format = '%Y-%m-%d %H:%M:%S'
    formatter = logging.Formatter(format_str, date_format)
    # TODO: replace the all-zero GUID with your instrumentation key.
    handler = AzureLogHandler(
        connection_string='InstrumentationKey=00000000-0000-0000-0000-000000000000')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    
    def valuePrompt():
        line = input("Enter a value: ")
        logger.warning(line)
    
    def main():
        while True:
            valuePrompt()
    
    if __name__ == "__main__":
        main()
    
  2. ログにカスタム ディメンションを追加することもできます。You can also add custom dimensions to your logs. これらは、Azure Monitor に customDimensions のキーと値のペアとして表示されます。These will appear as key-value pairs in customDimensions in Azure Monitor.

注意

この機能を使用するには、ディクショナリを引数としてログに渡す必要があります。その他のデータ構造は無視されます。For this feature to work, you need to pass a dictionary as an argument to your logs, any other data structure will be ignored. 文字列の書式設定を維持するには、それらをディクショナリに格納し、引数として渡します。To maintain string formatting, store them in a dictionary and pass them as arguments.

```python
import logging

from opencensus.ext.azure.log_exporter import AzureLogHandler

logger = logging.getLogger(__name__)
# TODO: replace the all-zero GUID with your instrumentation key.
logger.addHandler(AzureLogHandler(
    connection_string='InstrumentationKey=00000000-0000-0000-0000-000000000000')
)
logger.warning('action', {'key-1': 'value-1', 'key-2': 'value2'})
```
  1. トレース コンテキスト データを使用してログを強化する方法の詳細については、OpenCensus Python ログの統合に関するページを参照してください。For details on how to enrich your logs with trace context data, see OpenCensus Python logs integration.

クエリを使用してデータを表示するView your data with queries

アプリケーションから送信されたテレメトリ データは、 [Logs(Analytics)] (ログ (分析)) タブを使用して表示できます。You can view the telemetry data that was sent from your application through the Logs (Analytics) tab.

[Logs(Analytics)] (ログ (分析)) が赤い枠線で囲まれた概要ウィンドウのスクリーンショット

[アクティブ] の一覧で次のようにします。In the list under Active:

  • Azure Monitor のトレース エクスポーターで送信されたテレメトリについては、requests の下に受信した要求が表示されます。For telemetry sent with the Azure Monitor trace exporter, incoming requests appear under requests. 送信または処理中の要求は、dependencies の下に表示されます。Outgoing or in-process requests appear under dependencies.
  • Azure Monitor メトリック エクスポーターを使用して送信されたテレメトリの場合、送信されたメトリックは customMetrics の下に表示されます。For telemetry sent with the Azure Monitor metrics exporter, sent metrics appear under customMetrics.
  • Azure Monitor ログ エクスポーターを使用して送信されたテレメトリの場合、ログは traces の下に表示されます。For telemetry sent with the Azure Monitor logs exporter, logs appear under traces. 例外は exceptions の下に表示されます。Exceptions appear under exceptions.

クエリとログの使用方法の詳細については、「Azure Monitor のログ」を参照してください。For more detailed information about how to use queries and logs, see Logs in Azure Monitor.

OpenCensus for Python に関する詳細情報Learn more about OpenCensus for Python

次のステップNext steps

警告Alerts

  • 可用性テスト: サイトが Web で表示できることを確認するためのテストを作成します。Availability tests: Create tests to make sure your site is visible on the web.
  • スマート診断: これらのテストは自動的に実行されます。セットアップするために何かをする必要はありません。Smart diagnostics: These tests run automatically, so you don't have to do anything to set them up. アプリの要求が失敗する割合が異常な場合に通知します。They tell you if your app has an unusual rate of failed requests.
  • メトリック アラート: メトリックがしきい値を超えた場合に警告するようにアラートを設定 します。Metric alerts: Set alerts to warn you if a metric crosses a threshold. メトリック アラートはカスタム メトリックで設定し、コード化してアプリに組み込むことができます。You can set them on custom metrics that you code into your app.