

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon Managed Service for Apache Flink 中記錄和監控
<a name="monitoring-overview"></a>

監控是維護 Managed Service for Apache Flink 應用程式之可靠性、可用性和效能的重要部分。您應該從 AWS 解決方案的所有部分收集監控資料，以便在發生多點失敗時更輕鬆地偵錯。

在開始監控 Managed Service for Apache Flink 之前，應先建立監控規劃，為下列問題提供解答：
+ 監控目標是什麼？
+ 要監控哪些資源？
+ 監控這些資源的頻率為何？
+ 要使用哪些監控工具？
+ 誰將執行監控任務？
+ 發生問題時應該通知誰？

下一個步驟是在您的環境中建立正常 Managed Service for Apache Flink 效能的基準。您可以在各種時間及不同負載條件下測量效能，以完成此項作業。監控 Managed Service for Apache Flink 時，可以儲存歷史監控資料。如此您才能與目前的效能資料做比較、辨識正常效能模式和效能異常狀況和規劃問題處理方式。

**Topics**
+ [登入 Managed Service for Apache Flink](logging.md)
+ [Managed Service for Apache Flink 中的監控](monitoring.md)
+ [在 Managed Service for Apache Flink 中設定應用程式記錄](cloudwatch-logs.md)
+ [使用 CloudWatch Logs Insights 分析日誌](cloudwatch-logs-reading.md)
+ [Managed Service for Apache Flink 中的指標和維度](metrics-dimensions.md)
+ [將自訂訊息寫入 CloudWatch Logs](cloudwatch-logs-writing.md)
+ [使用 記錄 Managed Service for Apache Flink API 呼叫 AWS CloudTrail](logging-using-cloudtrail.md)

# 登入 Managed Service for Apache Flink
<a name="logging"></a>

記錄對於生產應用程式了解錯誤和失敗非常重要。不過，記錄子系統需要收集日誌項目並將其轉寄至 CloudWatch Logs。雖然有些記錄正常且理想，但大量記錄可能會使服務多載，並導致 Flink 應用程式落後。記錄例外狀況和警告當然是一個好主意。但是您無法為 Flink 應用程式處理的每則訊息產生日誌訊息。Flink 針對高輸出量和低延遲進行最佳化，但記錄子系統沒有。如果確實需要為每個已處理的訊息產生日誌輸出，請在 Flink 應用程式內使用額外的資料串流，並使用適當的接收器將資料傳送到 Amazon S3 或 CloudWatch。請勿將 Java 記錄系統用於此目的。此外，Managed Service for Apache Flink 的 `Debug Monitoring Log Level` 設定會產生大量流量，從而會造成背壓。您只能在主動調查應用程式問題時使用它。

## 使用 CloudWatch Logs Insights 查詢日誌
<a name="logging-querying"></a>

CloudWatch Logs Insights 是一項功能強大的服務，可大規模查詢日誌。客戶應利用其功能快速搜尋日誌，以識別並減輕操作事件期間的錯誤。

 下列查詢會在所有任務管理員記錄中尋找例外狀況，並根據其發生的時間排序。

```
fields @timestamp, @message
| filter isPresent(throwableInformation.0) or isPresent(throwableInformation) or @message like /(Error|Exception)/
| sort @timestamp desc
```

如需其他有用的查詢，請參閱[範例查詢](https://docs.aws.amazon.com/managed-flink/latest/java/cloudwatch-logs-reading.html#cloudwatch-logs-reading-examples)。

# Managed Service for Apache Flink 中的監控
<a name="monitoring"></a>

在生產環境中執行串流應用程式時，您著手持續且無限期地執行應用程式。它對實現所有元件的監控和適當報警至關重要，不只是對 Flink 應用程式。否則，您可能會較早就錯過新出現的問題，只在問題完全顯現並且更難以緩解之後才意識到操作事件。要監控的一般事項包括：
+ 來源是否正在擷取資料？
+ 是否已從來源讀取資料 (從來源角度看)？
+ Flink 應用程式是否正在接收資料？
+ Flink 應用程式能夠跟上還是落後？
+ Flink 應用程式是否將資料保存到接收器中 (從應用程式角度看)？
+ 接收器是否正在接收資料？

然後應該考慮針對 Flink 應用程式的更具體指標。此 [CloudWatch 儀表板](https://github.com/aws-samples/kda-metrics-dashboard)提供了一個不錯的起點。如需要為生產應用程式監控的指標之詳細資訊，請參閱[搭配 Amazon Managed Service for Apache Flink 使用 CloudWatch 警示](monitoring-metrics-alarms.md)。這些指標包括：
+ **records\$1lag\$1max** 和 **millisbehindLatest**：如果應用程式正在從 Kinesis 或 Kafka 取用，這些指標會指出應用程式是否落後，需要進行擴展以跟上目前的負載。這是一個很好的通用指標，很容易跟踪各種應用程式。但它只能用於被動式擴展，也就是說，當應用程式已經落後時。
+ **cpuUtilization** 和 **heapMemoryUtilization**：這些指標可清楚地指出應用程式的整體資源使用率，並且除非應用程式為 I/O 綁定，否則可用於主動擴展。
+ **downtime**：停機時間大於零表示應用程式失敗。如果值大於 0，表示應用程式未在處理任何資料。
+ **lastCheckpointSize** 和 *lastCheckpointDuration*：這些指標監控有多少資料存儲在狀態中以及需要多長時間執行檢查點。如果檢查點增長或花費較長時間，應用程式會持續花費時間在檢查點上，而且實際處理的週期較少。在某些時候，檢查點可能會變得太大或花費很長時間才會失敗。除了監控絕對值之外，客戶還應考慮使用 `RATE(lastCheckpointSize)` 和 `RATE(lastCheckpointDuration)` 監控變動率。
+ **numberOfFailedCheckpoint**：此指標會計算應用程式啟動後失敗的檢查點數目。根據應用程式的不同，如果檢查點偶爾失敗，該指標可以容忍。但是，如果檢查點經常出現故障，則應用程式可能運作不正常，需要進一步關注。我們建議監控 `RATE(numberOfFailedCheckpoints)` 以發出梯度警示，而不是絕對值。

# 在 Managed Service for Apache Flink 中設定應用程式記錄
<a name="cloudwatch-logs"></a>

透過將 Amazon CloudWatch 記錄選項新增至您的 Managed Service for Apache Flink 應用程式，您可以監控應用程式事件或組態問題。

本主題說明如何將應用程式設定為將應用程式事件寫入 CloudWatch Logs 串流。CloudWatch 記錄選項是應用程式設定和許可的集合，您的應用程式用它來設定將應用程式事件寫入 CloudWatch Logs 的方式。您可以使用 AWS 管理主控台 或 () 新增和設定 CloudWatch AWS Command Line Interface 記錄選項AWS CLI。

請注意下列有關將 CloudWatch 記錄選項新增至應用程式的事項：
+ 當您使用主控台新增 CloudWatch 記錄選項時，Managed Service for Apache Flink 會為您建立 CloudWatch 日誌群組和日誌串流，並新增應用程式寫入日誌串流所需的許可。
+ 使用 API 新增 CloudWatch 記錄選項時，還必須建立應用程式的日誌群組和日誌串流，並新增應用程式寫入日誌串流所需的許可。

## 使用主控台設定 CloudWatch 記錄
<a name="cloudwatch-logs-console"></a>

在主控台中為應用程式啟用 CloudWatch 記錄時，會為您建立 CloudWatch 日誌群組和日誌串流。此外，您應用程式的許可政策也會更新為具有寫入串流的許可。

Managed Service for Apache Flink 會建立使用下列慣例命名的日誌群組，其中 *ApplicationName* 是應用程式的名稱。

```
/aws/kinesis-analytics/ApplicationName
```

Managed Service for Apache Flink 會以下列名稱在新日誌群組中建立日誌串流。

```
kinesis-analytics-log-stream
```

您可以使用**設定應用程式**頁面的**監控日誌層級**區塊，設定應用程式的監控指標層級和監控日誌層級。如需應用程式日誌層級的相關資訊，請參閱[控制應用程式監控層級](#cloudwatch_levels)。

## 使用 CLI 設定 CloudWatch 記錄
<a name="cloudwatch-logs-api"></a>

若要使用 新增 CloudWatch 記錄選項 AWS CLI，請完成下列操作：
+ 建立 CloudWatch 日誌群組和日誌串流。
+ 當您使用 [CreateApplication](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 動作建立應用程式時，新增記錄選項，或使用 [AddApplicationCloudWatchLoggingOption](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_AddApplicationCloudWatchLoggingOption.html) 動作將記錄選項新增至現有的應用程式。
+ 將許可新增至應用程式的政策中，以寫入日誌。

### 建立 CloudWatch 日誌群組和日誌串流
<a name="cloudwatch-logs-api-create"></a>

您可以使用 CloudWatch Logs 主控台或 API 來建立 CloudWatch 日誌群組和日誌串流。如需如何建立 CloudWatch 日誌群組和日誌串流的相關資訊，請參閱[使用日誌群組和日誌串流](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)。

### 使用應用程式 CloudWatch 記錄選項
<a name="adding_cloudwatch"></a>

使用下列 API 動作將 CloudWatch 日誌選項新增至新的或現有的應用程式，或變更現有應用程式的日誌選項。如需如何使用 JSON 檔案作為 API 動作輸入的相關資訊，請參閱 [Managed Service for Apache Flink API 範例程式碼](api-examples.md)。

#### 建立應用程式時新增 CloudWatch 日誌選項
<a name="add_cloudwatch_create"></a>

下列範例示範如何在建立應用程式時使用 `CreateApplication` 動作新增 CloudWatch 日誌選項。在此範例中，使用您自己的資訊取代*要新增至新應用程式的 CloudWatch 日誌串流的 Amazon Resource Name (ARN)*。如需該動作的詳細資訊，請參閱 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html)。

```
{
    "ApplicationName": "test",
    "ApplicationDescription": "test-application-description",
    "RuntimeEnvironment": "FLINK-1_15",
    "ServiceExecutionRole": "arn:aws:iam::123456789123:role/myrole",
    "ApplicationConfiguration": {
        "ApplicationCodeConfiguration": {
            "CodeContent": {
                "S3ContentLocation":{
                              "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket",
                              "FileKey": "myflink.jar"
                }
            },
            "CodeContentType": "ZIPFILE"
        }
    },
    "CloudWatchLoggingOptions": [{
      "LogStreamARN": "<Amazon Resource Name (ARN) of the CloudWatch log stream to add to the new application>"
	}]
}
```

#### 將 CloudWatch 日誌選項新增至現有應用程式
<a name="add_to_existing_app"></a>

下列範例示範如何使用 `AddApplicationCloudWatchLoggingOption` 動作將 CloudWatch 日誌選項新增至現有的應用程式。在下列範例中，使用您自己的資訊取代每個*使用者輸入預留位置*。如需該動作的詳細資訊，請參閱 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_AddApplicationCloudWatchLoggingOption.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_AddApplicationCloudWatchLoggingOption.html)。

```
{
   "ApplicationName": "<Name of the application to add the log option to>",
   "CloudWatchLoggingOption": { 
      "LogStreamARN": "<ARN of the log stream to add to the application>"
   },
   "CurrentApplicationVersionId": <Version of the application to add the log to>
}
```

#### 更新現有的 CloudWatch 日誌選項
<a name="update_existing"></a>

下列範例示範如何使用 `UpdateApplication` 動作修改現有的 CloudWatch 日誌選項。在下列範例中，使用您自己的資訊取代每個*使用者輸入預留位置*。如需該動作的詳細資訊，請參閱 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html)。

```
{
   "ApplicationName": "<Name of the application to update the log option for>",
   "CloudWatchLoggingOptionUpdates": [ 
         { 
            "CloudWatchLoggingOptionId": "<ID of the logging option to modify>",
            "LogStreamARNUpdate": "<ARN of the new log stream to use>"
         }
      ],
   "CurrentApplicationVersionId": <ID of the application version to modify>
}
```

#### 從應用程式刪除 CloudWatch 日誌選項
<a name="delete-log"></a>

下列範例示範如何使用 `DeleteApplicationCloudWatchLoggingOption` 動作刪除現有的 CloudWatch 日誌選項。在下列範例中，使用您自己的資訊取代每個*使用者輸入預留位置*。如需該動作的詳細資訊，請參閱 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DeleteApplicationCloudWatchLoggingOption.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DeleteApplicationCloudWatchLoggingOption.html)。

```
{
   "ApplicationName": "<Name of application to delete log option from>",
   "CloudWatchLoggingOptionId": "<ID of the application log option to delete>",
   "CurrentApplicationVersionId": <Version of the application to delete the log option from>
}
```

#### 設定應用程式記錄層級
<a name="cloudwatch-level"></a>

若要設定應用程式記錄層級，請使用 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 動作的 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_MonitoringConfiguration.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_MonitoringConfiguration.html) 參數或 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 動作的 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_MonitoringConfigurationUpdate.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_MonitoringConfigurationUpdate.html) 參數。

如需應用程式日誌層級的相關資訊，請參閱[控制應用程式監控層級](#cloudwatch_levels)。

##### 建立應用程式時設定應用程式記錄層級
<a name="cloudwatch-level-create"></a>

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 動作的下列範例請求會將應用程式日誌層級設定為 `INFO`。

```
{
   "ApplicationName": "MyApplication",                    
   "ApplicationDescription": "My Application Description",
   "ApplicationConfiguration": {
      "ApplicationCodeConfiguration":{
      "CodeContent":{
        "S3ContentLocation":{
          "BucketARN":"arn:aws:s3:::amzn-s3-demo-bucket",
          "FileKey":"myflink.jar",
          "ObjectVersion":"AbCdEfGhIjKlMnOpQrStUvWxYz12345"
        }
      },
      "CodeContentType":"ZIPFILE"
      },
      "FlinkApplicationConfiguration": 
         "MonitoringConfiguration": { 
            "ConfigurationType": "CUSTOM",
            "LogLevel": "INFO"
         }
      },
   "RuntimeEnvironment": "FLINK-1_15",
   "ServiceExecutionRole": "arn:aws:iam::123456789123:role/myrole"
}
```

##### 更新應用程式記錄層級
<a name="cloudwatch-level-update"></a>

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 動作的下列範例請求會將應用程式日誌層級設定為 `INFO`。

```
{
   "ApplicationConfigurationUpdate": {
      "FlinkApplicationConfigurationUpdate": { 
         "MonitoringConfigurationUpdate": { 
            "ConfigurationTypeUpdate": "CUSTOM",
            "LogLevelUpdate": "INFO"
         }
      }
   }
}
```

### 新增寫入 CloudWatch 日誌串流的許可
<a name="enable_putlogevents"></a>

Managed Service for Apache Flink 需要將組態錯誤寫入 CloudWatch 的許可。您可以將這些許可新增至 Managed Service for Apache Flink 擔任的 AWS Identity and Access Management (IAM) 角色。

如需將 IAM 角色用於 Managed Service for Apache Flink 的詳細資訊，請參閱[Amazon Managed Service for Apache Flink 的身分和存取管理](security-iam.md)。

#### 信任政策
<a name="enable_putlogevents_trust_policy"></a>

若要授與 Managed Service for Apache Flink 許可以擔任 IAM 角色，您可以將以下信任政策連接到服務執行角色。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "kinesisanalytics.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

#### 許可政策
<a name="enable_putlogevents_permissions_policy"></a>

若要向應用程式授與許可，以便從 Managed Service for Apache Flink 資源將日誌事件寫入 CloudWatch，您可以使用下列 IAM 許可政策。為日誌群組和串流提供正確的 Amazon Resource Name (ARN)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Stmt0123456789000",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:123456789012:log-group:my-log-group:log-stream:my-log-stream*",
                "arn:aws:logs:us-east-1:123456789012:log-group:my-log-group:*",
                "arn:aws:logs:us-east-1:123456789012:log-group:*"
            ]
        }
    ]
}
```

------

## 控制應用程式監控層級
<a name="cloudwatch_levels"></a>

您可以使用應用程式*監控指標層級*和*監控日誌層級*來控制應用程式日誌訊息的產生。

應用程式的監控指標層級會控制日誌訊息的精細程度。監控指標層級的定義如下：
+ **應用程式**：指標的適用範圍是整個應用程式。
+ **任務**：指標的適用範圍是每個任務。如需任務的相關資訊，請參閱 [在 Managed Service for Apache Flink 中實作應用程式擴展](how-scaling.md)。
+ **運算子**：指標的適用範圍是每個運算子。如需運算子的相關資訊，請參閱 [使用 Managed Service for Apache Flink 中的運算子搭配 DataStream API 轉換資料](how-operators.md)。
+ **平行處理層級**：指標的適用範圍是應用程式平行處理層級。您只能使用 [UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html) API 的 [MonitoringConfigurationUpdate](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_MonitoringConfigurationUpdate.html) 參數來設定此指標層級。您無法使用控制台來設定此指標層級。如需平行處理層級的相關資訊，請參閱 [在 Managed Service for Apache Flink 中實作應用程式擴展](how-scaling.md)。

應用程式的監控日誌層級會控制應用程式日誌的詳細程度。監控日誌層級的定義如下：
+ **錯誤**：應用程式的潛在災難性事件。
+ **警告**：應用程式的可能有害的情況。
+ **資訊**：應用程式的資訊和暫時性故障事件。建議您使用此記錄層級。
+ **偵錯**：對於應用程式偵錯最有用的精細資訊事件。*注意*：此層級僅適用於暫時偵錯之目的。

## 套用記錄最佳實務
<a name="cloudwatch_bestpractices"></a>

我們建議您的應用程式使用**資訊**記錄層級。我們建議您使用此層級以確保看到 Apache Flink 錯誤，這些錯誤記錄在**資訊**層級而非**錯誤**層級。

我們建議您只在調查應用程式問題時暫時使用**偵錯**層級。問題解決後，切換回**資訊**層級。使用**偵錯**記錄層級將顯著影響應用程式的效能。

過多的記錄也會大幅影響應用程式效能。例如，建議您不要為每筆處理的記錄寫入日誌項目。過多的記錄可能會導致嚴重的資料處理瓶頸，並可能導致從來源讀取資料時產生背壓。

## 執行記錄疑難排解
<a name="cloudwatch_troubleshooting"></a>

如果應用程式日誌未寫入日誌串流，請驗證下列項目：
+ 確認應用程式的 IAM 角色和政策正確無誤。您的應用程式政策需要下列許可才能存取日誌串流：
  + `logs:PutLogEvents`
  + `logs:DescribeLogGroups`
  + `logs:DescribeLogStreams`

  如需詳細資訊，請參閱 [新增寫入 CloudWatch 日誌串流的許可](#enable_putlogevents)。
+ 確認應用程式正在執行。若要檢查應用程式的狀態，請在主控台中檢視應用程式的頁面，或使用 [DescribeApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_DescribeApplication.html) 或 [ListApplications](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_ListApplications.html) 動作。
+ 監控 CloudWatch 指標 (例如 `downtime`)，以診斷其他應用程式問題。如需讀取 CloudWatch 指標的相關資訊，請參閱 [Managed Service for Apache Flink 中的指標和維度](metrics-dimensions.md)。

## 使用 CloudWatch Logs Insights
<a name="cloudwatch_next"></a>

在應用程式中啟用 CloudWatch 記錄後，您可以使用 CloudWatch Logs Insights 來分析應用程式日誌。如需詳細資訊，請參閱[使用 CloudWatch Logs Insights 分析日誌](cloudwatch-logs-reading.md)。

# 使用 CloudWatch Logs Insights 分析日誌
<a name="cloudwatch-logs-reading"></a>

如上一節所述，將 CloudWatch 記錄選項新增至應用程式後，您可以使用 CloudWatch Logs Insights 查詢您的日誌串流中是否有特定事件或錯誤。

CloudWatch Logs Insights 可讓您以互動方式搜尋和分析 CloudWatch Logs 中的日誌資料。

如需 CloudWatch Logs Insights 使用入門的相關資訊，請參閱[使用 CloudWatch Logs Insights 分析日誌資料](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html)。

## 執行範例查詢
<a name="cloudwatch-logs-reading-run"></a>

本節描述了如何執行 CloudWatch Logs Insights 查詢範例。

**先決條件**
+ 在 CloudWatch Logs 中設定的現有日誌群組和日誌串流。
+ 存放在 CloudWatch Logs 中的現有日誌。

如果您使用 服務 AWS CloudTrail，例如 Amazon Route 53 或 Amazon VPC，您可能已經設定這些服務的日誌以前往 CloudWatch Logs。如需將日誌傳送到 CloudWatch Logs 的詳細資訊，請參閱 [CloudWatch Logs 入門](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_GettingStarted.html)。

CloudWatch Logs Insights 中的查詢會從日誌事件傳回一組欄位，或在日誌事件上執行的數學彙總或其他運算的結果。本節示範的查詢會傳回日誌事件清單。

**執行 CloudWatch Logs Insights 範例查詢**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，選擇 ** Insights**。

   

1. 熒幕上方附近的查詢編輯器包含可傳回 20 筆最新日誌事件的預設查詢。在查詢編輯器上方，選取要查詢的日誌群組。

   

   選取日誌群組時，CloudWatch Logs Insights 會自動偵測日誌群組中資料內的欄位，並在右側窗格的 **Discovered fields** (已探索欄位) 中顯示。它也會顯示一段時間內此日誌群組中日誌事件的長條圖。此長條圖顯示日誌群組中符合您的查詢和時間範圍的事件分佈，而不只是表格中顯示的事件。

1. 選擇 **Run query** (執行查詢)。

   查詢的結果隨即出現。在這個範例中，結果是最新的 20 個日誌事件 (任何類型)。

1. 若要查看其中一個傳回的日誌事件的所有欄位，請選擇該日誌事件左側的箭頭。

如需如何執行和修改 CloudWatch Logs Insights 查詢的詳細資訊，請參閱[執行和修改範例查詢](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_RunSampleQuery.html)。

## 檢閱範例查詢
<a name="cloudwatch-logs-reading-examples"></a>

本節包含用於分析 Managed Service for Apache Flink 應用程式日誌的 CloudWatch Logs Insights 範例查詢。這些查詢會搜尋數個範例錯誤條件，並作為撰寫查詢以尋找其他錯誤條件的範本。

**注意**  
使用您應用程式的「地區」和「帳戶 ID」取代下列查詢範例中的地區 (*us-west-2*)、帳戶 ID (*012345678901*) 和應用程式名稱 (*YourApplication*)。

**Topics**
+ [分析操作：任務的分佈](#cloudwatch-logs-reading-tm)
+ [分析操作：平行處理的變化](#cloudwatch-logs-reading-auto)
+ [分析錯誤：存取遭拒](#cloudwatch-logs-reading-access)
+ [分析錯誤：找不到來源或接收器](#cloudwatch-logs-reading-con)
+ [分析錯誤：應用程式任務相關的失敗](#cloudwatch-logs-reading-apps)

### 分析操作：任務的分佈
<a name="cloudwatch-logs-reading-tm"></a>

下列 CloudWatch Logs Insights 查詢會傳回 Apache Flink 作業管理員在任務管理員之間分配的任務數目。您需要將查詢的時間範圍設定為符合一個作業執行，以便查詢不會傳回來自先前作業的任務。如需平行處理層級的詳細資訊，請參閱[實作應用程式擴展](how-scaling.md)。

```
fields @timestamp, message
| filter message like /Deploying/
| parse message " to flink-taskmanager-*" as @tmid
| stats count(*) by @tmid
| sort @timestamp desc
| limit 2000
```

下列 CloudWatch Logs Insights 查詢會傳回指派給每個任務管理員的子任務。子任務的總數是每個任務的平行處理層級的總和。任務平行處理層級衍生自運算子平行處理層級，且預設會與應用程式的平行處理層級相同，除非您在程式碼中指定 `setParallelism` 來變更它。如需設定運算子平行處理的詳細資訊，請參閱 [Apache Flink 文件](https://nightlies.apache.org/flink/flink-docs-release-1.15/)中的[設定平行處理：運算子層級](https://nightlies.apache.org/flink/flink-docs-release-1.15/dev/parallel.html#operator-level)。

```
fields @timestamp, @tmid, @subtask
| filter message like /Deploying/
| parse message "Deploying * to flink-taskmanager-*" as @subtask, @tmid
| sort @timestamp desc
| limit 2000
```

如需任務排程的詳細資訊，請參閱 [Apache Flink 文件](https://nightlies.apache.org/flink/flink-docs-release-1.15/)中的[作業和排程](https://nightlies.apache.org/flink/flink-docs-release-1.15/internals/job_scheduling.html)。

### 分析操作：平行處理的變化
<a name="cloudwatch-logs-reading-auto"></a>

下列 CloudWatch Logs Insights 查詢會傳回應用程式平行處理層級的變更 (例如由於自動擴展)。此查詢還會傳回應用程式平行處理層級的手動變更。如需自動擴展的相關資訊，請參閱[在 Managed Service for Apache Flink 中使用自動擴展](how-scaling-auto.md)。

```
fields @timestamp, @parallelism
| filter message like /property: parallelism.default, /
| parse message "default, *" as @parallelism
| sort @timestamp asc
```

### 分析錯誤：存取遭拒
<a name="cloudwatch-logs-reading-access"></a>

下列 CloudWatch Logs Insights 查詢會傳回 `Access Denied` 日誌。

```
fields @timestamp, @message, @messageType
| filter applicationARN like /arn:aws:kinesisanalyticsus-west-2:012345678901:application\/YourApplication/
| filter @message like /AccessDenied/
| sort @timestamp desc
```

### 分析錯誤：找不到來源或接收器
<a name="cloudwatch-logs-reading-con"></a>

下列 CloudWatch Logs Insights 查詢會傳回 `ResourceNotFound` 日誌。`ResourceNotFound`如果找不到 Kinesis 來源或接收器，會記錄結果。

```
fields @timestamp,@message
| filter applicationARN like /arn:aws:kinesisanalyticsus-west-2:012345678901:application\/YourApplication/
| filter @message like /ResourceNotFoundException/
| sort @timestamp desc
```

### 分析錯誤：應用程式任務相關的失敗
<a name="cloudwatch-logs-reading-apps"></a>

下列 CloudWatch Logs Insights 查詢會傳回應用程式的任務相關失敗日誌。如果應用程式的狀態從 `RUNNING` 切換到 `RESTARTING`，就會產生這些日誌結果。

```
fields @timestamp,@message
| filter applicationARN like /arn:aws:kinesisanalyticsus-west-2:012345678901:application\/YourApplication/
| filter @message like /switched from RUNNING to RESTARTING/
| sort @timestamp desc
```

對於使用 Apache Flink 1.8.2 版及以前版本的應用程式，任務相關的失敗將導致應用程式狀態反而從 `RUNNING` 切換到 `FAILED`。使用 Apache Flink 1.8.2 及之前版本時，請使用下列查詢來搜尋與應用程式任務相關的失敗：

```
fields @timestamp,@message
| filter applicationARN like /arn:aws:kinesisanalyticsus-west-2:012345678901:application\/YourApplication/
| filter @message like /switched from RUNNING to FAILED/
| sort @timestamp desc
```

# Managed Service for Apache Flink 中的指標和維度
<a name="metrics-dimensions"></a>

當 Managed Service for Apache Flink 處理資料來源時，會向 Amazon CloudWatch 報告下列指標和維度。

**Flink 2.2 指標變更**  
Flink 2.2 引入可能會影響監控和警示的指標變更。升級之前，請檢閱下列變更：  
指標`fullRestarts`已移除。請改用 `numRestarts`。
`uptime` 和 `downtime`指標已棄用，並將在未來版本中移除。遷移至新的狀態特定指標。
Kinesis Data Streams 連接器 `bytesRequestedPerFetch` 6.0.0 的指標已移除。

## 應用程式指標
<a name="metrics-dimensions-jobs"></a>


| 指標 | 單位 | Description | Level | 使用須知 | 
| --- | --- | --- | --- | --- | 
| backPressuredTimeMsPerSecond\$1 | 毫秒 | 此任務或運算子每秒承受背壓的時間 (毫秒)。 | 任務、運算子、平行處理層級 | \$1 僅可用於執行 Flink 1.13 版本之 Managed Service for Apache Flink 應用程式。 這些指標可用於識別應用程式中的瓶頸。 | 
| busyTimeMsPerSecond\$1 | 毫秒 | 此任務或運算子每秒忙碌 (既不是閒置也沒有背壓) 的時間 (毫秒)。如果無法計算該值，則可以是 NaN。 | 任務、運算子、平行處理層級 | \$1 僅可用於執行 Flink 1.13 版本之 Managed Service for Apache Flink 應用程式。 這些指標可用於識別應用程式中的瓶頸。 | 
| cpuUtilization | 百分比 | 跨任務管理員的 CPU 使用率整體百分比。例如，如果有 5 個任務管理員，Managed Service for Apache Flink 會針對每個報告間隔發行此指標的 5 個樣本。 | 應用程式 | 您可以使用此指標來監控應用程式中的最小、平均和最大 CPU 使用率。CPUUtilization 指標只考慮在容器內執行之 TaskManager JVM 處理序的 CPU 使用率。 | 
| containerCPUUtilization | 百分比 | Flink 應用程式叢集中跨任務管理員容器的 CPU 使用率整體百分比。例如，如果有 5 個任務管理員，則相應地有 5 個任務管理員容器，Managed Service for Apache Flink 會每 1 分鐘的報告間隔發佈 2\$1 5 個此指標樣本。 | 應用程式 | 它按每個容器計算如下： *容器使用的總 CPU 時間 (秒) \$1 100 / 容器 CPU 限制 (單位為 CPU/秒)* `CPUUtilization` 指標只考慮在容器內執行之 TaskManager JVM 處理序的 CPU 使用率。同一個容器內的 JVM 外部還有其他元件在執行。`containerCPUUtilization` 指標為您提供了更完整的視角，包括容器中 CPU 耗盡的所有處理序以及由此引起的故障。  | 
| containerMemoryUtilization | 百分比 | Flink 應用程式叢集中跨任務管理員容器的記憶體使用率整體百分比。例如，如果有 5 個任務管理員，則相應地有 5 個任務管理員容器，Managed Service for Apache Flink 會每 1 分鐘的報告間隔發佈 2\$1 5 個此指標樣本。 | 應用程式 | 它按每個容器計算如下： *容器記憶體用量 (位元組) \$1 100 / 每 Pod 部署規格的容器記憶體限制 (位元組)* `HeapMemoryUtilization` 和 `ManagedMemoryUtilzations` 指標僅考慮特定的記憶體指標，例如 TaskManager JVM 的堆積記憶體使用情況或受管記憶體 (例如用於 [RocksDB 狀態後端](https://flink.apache.org/2021/01/18/rocksdb.html#:~:text=Conclusion-,The%20RocksDB%20state%20backend%20(i.e.%2C%20RocksDBStateBackend)%20is%20one%20of,with%20exactly%2Donce%20processing%20guarantees.)等原生處理序的 JVM 外記憶體使用情況)。`containerMemoryUtilization` 指標可為您提供更完整的視角，現包括工作集記憶體，這是一個更佳的記憶體總量耗盡追蹤器。在其耗盡之後，它將導致任務管理員 Pod `Out of Memory Error`。  | 
| containerDiskUtilization | 百分比 | Flink 應用程式叢集中跨任務管理員容器的磁碟使用率整體百分比。例如，如果有 5 個任務管理員，則相應地有 5 個任務管理員容器，Managed Service for Apache Flink 會每 1 分鐘的報告間隔發佈 2\$1 5 個此指標樣本。 | 應用程式 | 它按每個容器計算如下： *磁碟使用量 (位元組) \$1 100 / 容器的磁碟限制 (位元組)* 對於容器，它代表在其上設定容器根磁碟區的檔案系統的使用率。  | 
| currentInputWatermark | 毫秒 | 此應用程式/運算子/任務/執行緒收到的最後一個浮水印 | 應用程式、運算子、任務、平行處理層級 | 僅針對具有兩個輸入的維度發出此記錄。這是最後接收到的浮水印的最小值。 | 
| currentOutputWatermark | 毫秒 | 此應用程式/運算子/任務/執行緒發出的最後一個浮水印 | 應用程式、運算子、任務、平行處理層級 |  | 
| downtime 【已棄用】 | 毫秒 | 對於目前處於失敗/復原狀況的作業，此中斷期間經過的時間。 | 應用程式 | 此指標衡量作業失敗或復原時經過的時間。此指標針對執行中作業傳回 0，針對完成的作業傳回 -1。如果此指標不是 0 或 -1，則表示應用程式的 Apache Flink 作業執行失敗。**Flink 2.2 中已棄用。**請`failingTime`改用 `cancellingTime`、 `restartingTime`和/或 。 | 
| failingTime | 毫秒 | 應用程式處於失敗狀態所花費的時間 （以毫秒為單位）。使用此指標來監控應用程式失敗和觸發警示。 | 應用程式、流程 | 可從 Flink 2.2 取得。取代部分已棄用downtime指標。 | 
| heapMemoryUtilization | 百分比 | 任務管理員的整體堆積記憶體使用率。例如，如果有 5 個任務管理員，Managed Service for Apache Flink 會針對每個報告間隔發行此指標的 5 個樣本。 | 應用程式 | 您可以使用此指標來監控應用程式中的最小、平均和最大堆積記憶體使用率。HeapMemoryUtilization 只考慮特定記憶體指標，如 TaskManager JVM 的堆積記憶體使用情況。 | 
| idleTimeMsPerSecond\$1 | 毫秒 | 此任務或運算子每秒閒置 (沒有要處理的資料) 的時間 (毫秒)。閒置時間不包括背壓時間，因此如果任務受到背壓，則不會閒置。 | 任務、運算子、平行處理層級 | \$1 僅可用於執行 Flink 1.13 版本之 Managed Service for Apache Flink 應用程式。 這些指標可用於識別應用程式中的瓶頸。 | 
| lastCheckpointSize | 位元組 | 最後一個檢查點的大小總計 | 應用程式 | 您可以使用此指標判斷執行中應用程式的儲存體使用率。如果此指標的值增加，可能表示應用程式發生了問題，例如記憶體流失或瓶頸。 | 
| lastCheckpointDuration | 毫秒 | 完成最後一個檢查點所花費的時間 | 應用程式 | 此指標會測量完成最新檢查點所花費的時間。如果此指標的值增加，可能表示應用程式發生了問題，例如記憶體流失或瓶頸。在某些情況下，您可以藉由停用檢查點來疑難排解此問題。 | 
| managedMemoryUsed\$1 | 位元組 | 目前使用中的受管記憶體數量。 | 應用程式、運算子、任務、平行處理層級 | \$1 僅可用於執行 Flink 1.13 版本之 Managed Service for Apache Flink 應用程式。 這與 Java 堆積之外由 Flink 管理的記憶體有關。它用於 RocksDB 狀態後端，也可用於應用程式。 | 
| managedMemoryTotal\$1 | 位元組 | 記憶體總量。 | 應用程式、運算子、任務、平行處理層級 | \$1 僅可用於執行 Flink 1.13 版本之 Managed Service for Apache Flink 應用程式。 這與 Java 堆積之外由 Flink 管理的記憶體有關。它用於 RocksDB 狀態後端，也可用於應用程式。`ManagedMemoryUtilzations` 指標僅考慮特定的記憶體指標，例如受管記憶體 (用於 [RocksDB 狀態後端](https://flink.apache.org/2021/01/18/rocksdb.html#:~:text=Conclusion-,The%20RocksDB%20state%20backend%20(i.e.%2C%20RocksDBStateBackend)%20is%20one%20of,with%20exactly%2Donce%20processing%20guarantees.)等原生處理序的 JVM 外記憶體使用情況) | 
| managedMemoryUtilization\$1 | 百分比 | 由 managedMemoryUsed/managedMemoryTotal 所衍生 | 應用程式、運算子、任務、平行處理層級 | \$1 僅可用於執行 Flink 1.13 版本之 Managed Service for Apache Flink 應用程式。 這與 Java 堆積之外由 Flink 管理的記憶體有關。它用於 RocksDB 狀態後端，也可用於應用程式。 | 
| numberOfFailedCheckpoints | 計數 | 檢查點失敗的次數。 | 應用程式 | 您可以使用此指標來監控應用程式運作狀態和進度。檢查點可能會因為應用程式問題 (例如輸送量或許可問題) 而失敗。 | 
| numRecordsIn\$1 | 計數 | 此應用程式、運算子或任務已接收的記錄總數。 | 應用程式、運算子、任務、平行處理層級 | \$1 若要套用一段時間內 (秒/分鐘) 的 SUM 統計資料： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/managed-flink/latest/java/metrics-dimensions.html) 指標的「層級」指定此指標是衡量整個應用程式、特定運算子還是特定任務接收的記錄總數。 | 
| numRecordsInPerSecond\$1 | 計數/秒 | 此應用程式、運算子或任務每秒收到的記錄總數。 | 應用程式、運算子、任務、平行處理層級 | \$1 若要套用一段時間內 (秒/分鐘) 的 SUM 統計資料： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/managed-flink/latest/java/metrics-dimensions.html) 指標的「層級」指定此指標是衡量整個應用程式、特定運算子還是特定任務每秒接收的記錄總數。 | 
| numRecordsOut\$1 | 計數 | 此應用程式、運算子或任務發出的記錄總數。 | 應用程式、運算子、任務、平行處理層級 |  \$1 若要套用一段時間內 (秒/分鐘) 的 SUM 統計資料： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/managed-flink/latest/java/metrics-dimensions.html) 指標的「層級」指定此指標是衡量整個應用程式、特定運算子還是特定任務發出的記錄總數。 | 
| numLateRecordsDropped\$1 | 計數 | 應用程式、運算子、任務、平行處理層級 |  | \$1 若要套用一段時間內 (秒/分鐘) 的 SUM 統計資料： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/managed-flink/latest/java/metrics-dimensions.html) 此運算子或任務因遲到而丟棄的記錄數。 | 
| numRecordsOutPerSecond\$1 | 計數/秒 | 此應用程式、運算子或任務每秒發出的記錄總數。 | 應用程式、運算子、任務、平行處理層級 |  \$1 若要套用一段時間內 (秒/分鐘) 的 SUM 統計資料： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/managed-flink/latest/java/metrics-dimensions.html) 指標的「層級」指定此指標是衡量整個應用程式、特定運算子還是特定任務每秒發出的記錄總數。 | 
| oldGenerationGCCount | 計數 | 所有任務管理員中發生的垃圾回收操作總數。 | 應用程式 |  | 
| oldGenerationGCTime | 毫秒 | 執行垃圾回收操作所花費的總時間。 | 應用程式 | 您可以使用此指標來監控總計、平均和最大垃圾回收時間。 | 
| threadsCount | 計數 | 應用程式使用的即時執行緒總數。 | 應用程式 | 此指標衡量應用程式的程式碼使用的執行緒數目。這與應用程式平行處理層級不同。 | 
| cancellingTime | 毫秒 | 應用程式處於取消狀態所花費的時間 （以毫秒為單位）。使用此指標來監控應用程式取消操作。 | 應用程式、流程 | 可從 Flink 2.2 取得。取代部分已棄用downtime指標。 | 
| restartingTime | 毫秒 | 應用程式處於重新啟動狀態所花費的時間 （以毫秒為單位）。使用此指標來監控應用程式重新啟動行為。 | 應用程式、流程 | 可從 Flink 2.2 取得。取代部分已棄用downtime指標。 | 
| runningTime | 毫秒 | 應用程式在未中斷的情況下執行的時間 （以毫秒為單位）。取代已取代的uptime指標。 | 應用程式、流程 | 可從 Flink 2.2 取得。使用 直接取代已取代的uptime指標。 | 
| uptime 【已棄用】 | 毫秒 | 作業在不中斷的情況下執行的時間。 | 應用程式 | 您可以使用此指標來判斷作業是否在成功執行。此指標針對已完成的作業傳回 -1。**Flink 2.2 中已棄用。**請改用 `runningTime`。 | 
| jobmanagerFileDescriptorsMax | 計數 | JobManager 可用的檔案描述項數目上限。 | 應用程式、流程、主機 | 使用此指標來監控檔案描述項容量。 | 
| jobmanagerFileDescriptorsOpen | 計數 | JobManager 目前開啟的檔案描述項數量。 | 應用程式、流程、主機 | 使用此指標來監控檔案描述項用量，並偵測潛在的資源耗盡。 | 
| taskmanagerFileDescriptorsMax | 計數 | 每個 TaskManager 可用的檔案描述項數量上限。 | 應用程式、流程、主機、tm\$1id | 使用此指標來監控檔案描述項容量。 | 
| taskmanagerFileDescriptorsOpen | 計數 | 每個 TaskManager 的目前開啟檔案描述項數量。 | 應用程式、流程、主機、tm\$1id | 使用此指標來監控檔案描述項用量，並偵測潛在的資源耗盡。 | 
| KPUs\$1 | 計數 | 應用程式使用的 KPUs 總數。 | 應用程式 | \$1此指標每個計費期間 （一小時） 會收到一個範例。若要視覺化一段時間內的 KPUs 數量，請在至少一 (1) 小時內使用 MAX 或 AVG。 KPU 計數包含 `orchestration` KPU。如需詳細資訊，請參閱 [Managed Service for Apache Flink 定價](https://aws.amazon.com/managed-service-apache-flink/pricing/)。 | 

**Flink 2.2 指標遷移指引**  
**從 fullRestarts 遷移：**指標已在 Flink `fullRestarts` 2.2 中移除。請改用 `numRestarts` 指標。`numRestarts` 指標提供同等功能，可以直接取代 CloudWatch 警示，無需調整閾值。  
**從執行時間遷移：**在 Flink 2.2 中已棄用`uptime`指標，並將在未來版本中移除。請改用 `runningTime` 指標。`runningTime` 指標提供同等功能，可以直接取代 CloudWatch 警示，無需調整閾值。  
**從停機時間遷移：**在 Flink 2.2 中已棄用`downtime`指標，並將在未來版本中移除。根據您想要監控的內容，使用下列一或多個指標：  
`restartingTime`：監控重新啟動應用程式所花費的時間
`cancellingTime`：監控取消應用程式所花費的時間
`failingTime`：監控處於失敗狀態所花費的時間

## Kinesis Data Streams 連接器指標
<a name="metrics-dimensions-stream"></a>

AWS 除了下列項目之外， 還會發出 Kinesis Data Streams 的所有記錄：


| 指標 | 單位 | Description | Level | 使用須知 | 
| --- | --- | --- | --- | --- | 
| millisbehindLatest | 毫秒 | 取用者位於串流開頭之後的毫秒數，指出取用者落後目前時間多久。 | 應用程式 (用於串流)，平行處理層級 (用於 ShardId) | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/managed-flink/latest/java/metrics-dimensions.html)  | 

**注意**  
指標`bytesRequestedPerFetch`已在 Flink AWS 連接器 6.0.0 版 （唯一與 Flink 2.2 相容的連接器版本） 中移除。Flink 2.2 中唯一可用的 Kinesis Data Streams 連接器指標是 。 `millisBehindLatest`

## Amazon MSK 連接器指標
<a name="metrics-dimensions-msk"></a>

AWS 除了下列項目之外， 還會發出 Amazon MSK 的所有記錄：


| 指標 | 單位 | Description | Level | 使用須知 | 
| --- | --- | --- | --- | --- | 
| currentoffsets | N/A | 每個分割區的取用者目前的讀取位移。您可以依據主題名稱和分割區 ID 來指定特定分割區的指標。 | 應用程式 (針對主題)、平行處理層級 (針對 PartitionId) |  | 
| commitsFailed | N/A | 向 Kafka 遞交位移失敗的總數，如果啟用了位移遞交和檢查點。 | 應用程式、運算子、任務、平行處理層級 | 將位移遞交回 Kafka 只是公開取用者進度的一種手段，因此遞交失敗不會影響 Flink 的檢查點分割區位移完整性。 | 
| commitsSucceeded | N/A | 向 Kafka 成功遞交位移的總數，如果啟用了位移遞交和檢查點。 | 應用程式、運算子、任務、平行處理層級 |  | 
| committedoffsets | N/A | 每個分割區最後一次成功提交到 Kafka 的位移。您可以依據主題名稱和分割區 ID 來指定特定分割區的指標。 | 應用程式 (針對主題)、平行處理層級 (針對 PartitionId) |  | 
| records\$1lag\$1max | 計數 | 此視窗中任何分割區以記錄數目而言的最大延遲 | 應用程式、運算子、任務、平行處理層級 |  | 
| bytes\$1consumed\$1rate | 位元組 | 每秒使用的主題位元組平均數目 | 應用程式、運算子、任務、平行處理層級 |  | 

## Apache Zeppelin 指標
<a name="metrics-dimensions-zeppelin"></a>

對於 Studio 筆記本， 在應用程式層級 AWS 發出下列指標：`KPUs`、`cpuUtilization`、`heapMemoryUtilization`、`oldGenerationGCTime`、 `oldGenerationGCCount`和 `threadCount`。此外，它還會在應用程式層級發出下表中顯示的指標。


****  

| 指標 | 單位 | Description | Prometheus 名稱 | 
| --- | --- | --- | --- | 
| zeppelinCpuUtilization | 百分比 | Apache Zeppelin 伺服器中 CPU 使用率的整體百分比。 | process\$1cpu\$1usage | 
| zeppelinHeapMemoryUtilization | 百分比 | Apache Zeppelin 伺服器的堆積記憶體使用率整體百分比。 | jvm\$1memory\$1used\$1bytes | 
| zeppelinThreadCount | 計數 | Apache Zeppelin 伺服器使用的即時執行緒總數。 | jvm\$1threads\$1live\$1threads | 
| zeppelinWaitingJobs | 計數 | 等待執行緒的已排入佇列的 Apache Zeppelin 作業數目。 | jetty\$1threads\$1jobs | 
| zeppelinServerUptime | 秒鐘 | 伺服器啟動並執行的總時間。 | process\$1uptime\$1seconds | 

# 檢視 CloudWatch 指標
<a name="metrics-dimensions-viewing"></a>

您可以使用 Amazon CloudWatch 主控台或 AWS CLI來檢視應用程式的 CloudWatch 指標。

**使用 CloudWatch 主控台檢視指標**

1. 在 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在導覽窗格中，選擇 **指標**。

1. 在 Managed Service for Apache Flink 的**依類別分類的 CloudWatch 指標**窗格中，選擇指標類別。

1. 在上方窗格中，向下捲動以檢視完整指標清單。

**使用 檢視指標 AWS CLI**
+ 在命令提示中，使用下列命令。

  ```
  1. aws cloudwatch list-metrics --namespace "AWS/KinesisAnalytics" --region region
  ```

# 設定 CloudWatch 指標報告層級
<a name="cloudwatch-logs-levels"></a>

您可以控制應用程式建立的應用程式指標層級。Managed Service for Apache Flink 支援下列指標層級：
+ **應用程式**：應用程式只報告每個應用程式的最高層級指標。依預設，Managed Service for Apache Flink 指標在 Application 層級發佈。
+ **任務**：應用程式針對使用「任務」指標報告層級定義的指標來報告任務特定的指標維度，例如每秒進出應用程式的記錄數。
+ **運算子**：應用程式針對以「運算子」指標報告層級定義的指標來報告運算子特定的指標維度，例如每個篩選或對應操作的指標。
+ **平行處理層級**：應用程式為每個執行緒報告 `Task` 和 `Operator` 層級指標。由於成本過高，平行處理設定超過 64 的應用程式不建議使用此報告層級。
**注意**  
鑒於服務所產生的指標資料量，您只能使用此指標層級進行疑難排解。您只能使用 CLI 來設定此指標層級。此指標層級在主控台中無法使用。

預設層級為**應用程式**。應用程式會報告目前層級和所有更高層級的指標。例如，如果報告層級設定為**運算子**，則應用程式會報告**應用程式**、**任務**和**運算子**指標。

您可以使用 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 動作的 `MonitoringConfiguration` 參數或 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 動作的 `MonitoringConfigurationUpdate` 參數來設定 CloudWatch 指標報告層級。[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 動作的下列範例請求會將 CloudWatch 指標報告層級設定為**任務**：

```
{
   "ApplicationName": "MyApplication",  
   "CurrentApplicationVersionId": 4,
   "ApplicationConfigurationUpdate": { 
      "FlinkApplicationConfigurationUpdate": { 
         "MonitoringConfigurationUpdate": { 
            "ConfigurationTypeUpdate": "CUSTOM",
            "MetricsLevelUpdate": "TASK"
         }
      }
   }
}
```

您也可以使用 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 動作的 `LogLevel` 參數或 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 動作的 `LogLevelUpdate` 參數來設定記錄層級。您可以使用下列日誌層級：
+ `ERROR`：記錄可能復原的錯誤事件。
+ `WARN`：記錄可能導致錯誤的警告事件。
+ `INFO`：記錄資訊事件。
+ `DEBUG`：記錄一般偵錯事件。

如需 Log4j 記錄層級的詳細資訊，請參閱 [Apache Log4j](https://logging.apache.org/log4j/2.x/) 文件中的[自訂日誌層級](https://logging.apache.org/log4j/2.x/manual/customloglevels.html)。

# 搭配 Amazon Managed Service for Apache Flink 使用自訂指標
<a name="monitoring-metrics-custom"></a>

Managed Service for Apache Flink 向 CloudWatch 公開了 19 個指標，包括資源使用率和輸送量的指標。此外，您可以建立自己的指標來追蹤應用程式特定的資料，例如處理事件或存取外部資源。

**Topics**
+ [運作方式](#monitoring-metrics-custom-howitworks)
+ [檢視建立映射類別的範例](#monitoring-metrics-custom-examples)
+ [檢視自訂指標](#monitoring-metrics-custom-examples-viewing)

## 運作方式
<a name="monitoring-metrics-custom-howitworks"></a>

Managed Service for Apache Flink 中的自訂指標使用 Apache Flink 指標系統。Apache Flink 指標具有下列屬性：
+ **類型：**指標的類型說明衡量和報告資料的方式。可用的 Apache Flink 指標類型包括「計數」、「量計」、「長條圖」和「計量」。如需 Apache Flink 指標類型的詳細資訊，請參閱[指標類型](https://nightlies.apache.org/flink/flink-docs-release-1.15/monitoring/metrics.html#metric-types)。
**注意**  
AWS CloudWatch Metrics 不支援直方圖 Apache Flink 指標類型。CloudWatch 只顯示「計數」、「量計」和「計量」類型的 Apache Flink 指標。
+ **範圍：**指標的範圍包含其識別碼和一組指示如何向 CloudWatch 報告指標的鍵值對。指標的識別碼包含下列項目：
  + 系統範圍，指出報告指標的層級 (例如「運算子」)。
  + 使用者範圍，定義諸如使用者變數或指標群組名稱等屬性。這些屬性使用 [https://ci.apache.org/projects/flink/flink-docs-master/api/java/org/apache/flink/metrics/MetricGroup.html#addGroup-java.lang.String-java.lang.String-](https://ci.apache.org/projects/flink/flink-docs-master/api/java/org/apache/flink/metrics/MetricGroup.html#addGroup-java.lang.String-java.lang.String-) 或 [https://ci.apache.org/projects/flink/flink-docs-master/api/java/org/apache/flink/metrics/MetricGroup.html#addGroup-java.lang.String-](https://ci.apache.org/projects/flink/flink-docs-master/api/java/org/apache/flink/metrics/MetricGroup.html#addGroup-java.lang.String-) 定義。

  如需指標範圍的詳細資訊，請參閱[範圍](https://nightlies.apache.org/flink/flink-docs-release-1.15/monitoring/metrics.html#scope)。

如需 Apache Flink 指標的詳細資訊，請參閱 [Apache Flink 文件](https://nightlies.apache.org/flink/flink-docs-release-1.15/)中的[指標](https://nightlies.apache.org/flink/flink-docs-release-1.15/monitoring/metrics.html)。

若要在 Managed Service for Apache Flink 中建立自訂指標，您可以從任何透過呼叫 [https://nightlies.apache.org/flink/flink-docs-release-1.15/api/java/org/apache/flink/api/common/functions/RuntimeContext.html#getMetricGroup--](https://nightlies.apache.org/flink/flink-docs-release-1.15/api/java/org/apache/flink/api/common/functions/RuntimeContext.html#getMetricGroup--) 來擴充 `RichFunction` 的使用者函數存取 Apache Flink 指標系統。此方法會傳回 [MetricGroup](https://nightlies.apache.org/flink/flink-docs-release-1.15/api/java/org/apache/flink/metrics/MetricGroup.html) 物件，您可以用它來建立和註冊自訂指標。Managed Service for Apache Flink 會將使用群組索引鍵 `KinesisAnalytics` 建立的所有指標報告給 CloudWatch。您定義的自訂指標具有下列特性：
+ 您的自訂指標具有指標名稱和群組名稱。這些名稱必須包含根據 [Prometheus 命名規則](https://prometheus.io/docs/instrumenting/writing_exporters/#naming)的英數字元。
+ 您在使用者範圍中定義的屬性 (`KinesisAnalytics` 指標群組除外) 會發佈為 CloudWatch 維度。
+ 依預設，自訂指標會在 `Application` 層級發佈。
+ 維度 (任務/運算子/平行處理層級) 會根據應用程式的監控層級新增至指標。您可以使用 [CreateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_CreateApplication.html) 動作的 [MonitoringConfiguration](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_MonitoringConfiguration.html) 參數或 [UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html) 動作的 [MonitoringConfigurationUpdate](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_MonitoringConfigurationUpdate.html) 參數來設定應用程式的監控層級。

## 檢視建立映射類別的範例
<a name="monitoring-metrics-custom-examples"></a>

下列程式碼範例示範如何建立建立並遞增自訂指標的映射類別，以及如何透過將映射類別新增至`DataStream`物件，在應用程式中實作映射類別。

### 記錄計數自訂指標
<a name="monitoring-metrics-custom-examples-recordcount"></a>

下列程式碼範例示範如何建立映射類別，以建立可計算資料串流中記錄數目的指標 (功能與 `numRecordsIn` 指標相同)：

```
    private static class NoOpMapperFunction extends RichMapFunction<String, String> {
        private transient int valueToExpose = 0;
        private final String customMetricName;
 
        public NoOpMapperFunction(final String customMetricName) {
            this.customMetricName = customMetricName;
        }
 
        @Override
        public void open(Configuration config) {
            getRuntimeContext().getMetricGroup()
                    .addGroup("KinesisAnalytics")
                    .addGroup("Program", "RecordCountApplication")
                    .addGroup("NoOpMapperFunction")
                    .gauge(customMetricName, (Gauge<Integer>) () -> valueToExpose);
        }
 
        @Override
        public String map(String value) throws Exception {
            valueToExpose++;
            return value;
        }
    }
```

在上述範例中，`valueToExpose` 變數會針對應用程式處理的每筆記錄遞增。

定義映射類別之後，您可以建立實作對應的應用程式內串流：

```
DataStream<String> noopMapperFunctionAfterFilter =
    kinesisProcessed.map(new NoOpMapperFunction("FilteredRecords"));
```

如需此應用程式的完整程式碼，請參閱[記錄計數自訂指標應用程式](https://github.com/aws-samples/amazon-managed-service-for-apache-flink-examples/tree/main/java/CustomMetrics/RecordCount)。

### 單字計數自訂指標
<a name="monitoring-metrics-custom-examples-wordcount"></a>

下列程式碼範例示範如何建立映射類別，以建立可計算資料串流中字數的指標：

```
private static final class Tokenizer extends RichFlatMapFunction<String, Tuple2<String, Integer>> {
     
            private transient Counter counter;
     
            @Override
            public void open(Configuration config) {
                this.counter = getRuntimeContext().getMetricGroup()
                        .addGroup("KinesisAnalytics")
                        .addGroup("Service", "WordCountApplication")
                        .addGroup("Tokenizer")
                        .counter("TotalWords");
            }
     
            @Override
            public void flatMap(String value, Collector<Tuple2<String, Integer>>out) {
                // normalize and split the line
                String[] tokens = value.toLowerCase().split("\\W+");
     
                // emit the pairs
                for (String token : tokens) {
                    if (token.length() > 0) {
                        counter.inc();
                        out.collect(new Tuple2<>(token, 1));
                    }
                }
            }
        }
```

在上述範例中，`counter` 變數會針對應用程式處理的每個單字遞增。

定義映射類別之後，您可以建立實作對應的應用程式內串流：

```
// Split up the lines in pairs (2-tuples) containing: (word,1), and
// group by the tuple field "0" and sum up tuple field "1"
DataStream<Tuple2<String, Integer>> wordCountStream = input.flatMap(new Tokenizer()).keyBy(0).sum(1);
     
// Serialize the tuple to string format, and publish the output to kinesis sink
wordCountStream.map(tuple -> tuple.toString()).addSink(createSinkFromStaticConfig());
```

如需此應用程式的完整程式碼，請參閱[單字計數自訂指標應用程式](https://github.com/aws-samples/amazon-managed-service-for-apache-flink-examples/tree/main/java/CustomMetrics/WordCount)。

## 檢視自訂指標
<a name="monitoring-metrics-custom-examples-viewing"></a>

應用程式的自訂指標會顯示在 CloudWatch 指標主控台 **AWS/KinesisAnalytics** 儀表板的**應用程式**指標群組下。

# 搭配 Amazon Managed Service for Apache Flink 使用 CloudWatch 警示
<a name="monitoring-metrics-alarms"></a>

使用 Amazon CloudWatch 指標警示，您可在自己指定的時段內監看 CloudWatch 指標。警示會根據在數個期間與閾值相關的指標值或表達式值來執行一或多個動作。某個動作將通知傳送至 Amazon Simple Notification Service (Amazon SNS) 主題的範例。

如需 CloudWatch 警示的詳細資訊，請參閱[使用 Amazon CloudWatch 警示](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。

## 檢閱建議的警示
<a name="monitoring-metrics-alarms-recommended"></a>

本節包含用於監控 Managed Service for Apache Flink 應用程式的建議警示。

下表說明了建議的警示，其中包含下列欄位：
+ **指標表達式：**根據閾值測試的指標或指標表示式。
+ **統計值：**用來檢查指標的統計值 — 例如**平均值**。
+ **閾值：**使用此警示會要求您決定用來定義預期應用程式效能限制的閾值。您必須在正常情況下監控應用程式，藉此決定此閾值。
+ **說明：**可能觸發此警示的原因，以及該狀況的可能解決方案。


| 指標表達式 | 統計數字 | Threshold | Description | 
| --- |--- |--- |--- |
| downtime > 0 | Average | 0 |  A downtime greater than zero indicates that the application has failed. If the value is larger than 0, the application is not processing any data. Recommended for all applications. The 停機 metric measures the duration of an outage. A downtime greater than zero indicates that the application has failed. For troubleshooting, see [應用程式正在重新啟動](troubleshooting-rt-restarts.md). | 
| RATE (numberOfFailedCheckpoints) > 0 | Average | 0 | This metric counts the number of failed checkpoints since the application started. Depending on the application, it can be tolerable if checkpoints fail occasionally. But if checkpoints are regularly failing, the application is likely unhealthy and needs further attention. We recommend monitoring RATE(numberOfFailedCheckpoints) to alarm on the gradient and not on absolute values. Recommended for all applications. Use this metric to monitor application health and checkpointing progress. The application saves state data to checkpoints when it's healthy. Checkpointing can fail due to timeouts if the application isn't making progress in processing the input data. For troubleshooting, see [檢查點逾時](troubleshooting-chk-timeout.md). | 
| Operator.numRecordsOutPerSecond < threshold | Average | The minimum number of records emitted from the application during normal conditions.  | Recommended for all applications. Falling below this threshold can indicate that the application isn't making expected progress on the input data. For troubleshooting, see [輸送量太慢](troubleshooting-rt-throughput.md). | 
| records\$1lag\$1max\$1millisbehindLatest > threshold | Maximum | The maximum expected latency during normal conditions. | If the application is consuming from Kinesis or Kafka, these metrics indicate if the application is falling behind and needs to be scaled in order to keep up with the current load. This is a good generic metric that is easy to track for all kinds of applications. But it can only be used for reactive scaling, i.e., when the application has already fallen behind. Recommended for all applications. Use the records\$1lag\$1max metric for a Kafka source, or the millisbehindLatest for a Kinesis stream source. Rising above this threshold can indicate that the application isn't making expected progress on the input data. For troubleshooting, see [輸送量太慢](troubleshooting-rt-throughput.md). | 
| lastCheckpointDuration > threshold | Maximum | The maximum expected checkpoint duration during normal conditions. | Monitors how much data is stored in state and how long it takes to take a checkpoint. If checkpoints grow or take long, the application is continuously spending time on checkpointing and has less cycles for actual processing. At some points, checkpoints may grow too large or take so long that they fail. In addition to monitoring absolute values, customers should also considering monitoring the change rate with RATE(lastCheckpointSize) and RATE(lastCheckpointDuration). If the lastCheckpointDuration continuously increases, rising above this threshold can indicate that the application isn't making expected progress on the input data, or that there are problems with application health such as backpressure. For troubleshooting, see [無限制狀態成長](troubleshooting-rt-stateleaks.md). | 
| lastCheckpointSize > threshold | Maximum | The maximum expected checkpoint size during normal conditions. | Monitors how much data is stored in state and how long it takes to take a checkpoint. If checkpoints grow or take long, the application is continuously spending time on checkpointing and has less cycles for actual processing. At some points, checkpoints may grow too large or take so long that they fail. In addition to monitoring absolute values, customers should also considering monitoring the change rate with RATE(lastCheckpointSize) and RATE(lastCheckpointDuration). If the lastCheckpointSize continuously increases, rising above this threshold can indicate that the application is accumulating state data. If the state data becomes too large, the application can run out of memory when recovering from a checkpoint, or recovering from a checkpoint might take too long. For troubleshooting, see [無限制狀態成長](troubleshooting-rt-stateleaks.md). | 
| heapMemoryUtilization > threshold | Maximum | This gives a good indication of the overall resource utilization of the application and can be used for proactive scaling unless the application is I/O bound. The maximum expected heapMemoryUtilization size during normal conditions, with a recommended value of 90 percent. | You can use this metric to monitor the maximum memory utilization of task managers across the application. If the application reaches this threshold, you need to provision more resources. You do this by enabling automatic scaling or increasing the application parallelism. For more information about increasing resources, see [實作應用程式擴展](how-scaling.md). | 
| cpuUtilization > threshold | Maximum | This gives a good indication of the overall resource utilization of the application and can be used for proactive scaling unless the application is I/O bound. The maximum expected cpuUtilization size during normal conditions, with a recommended value of 80 percent. | You can use this metric to monitor the maximum CPU utilization of task managers across the application. If the application reaches this threshold, you need to provision more resources You do this by enabling automatic scaling or increasing the application parallelism. For more information about increasing resources, see [實作應用程式擴展](how-scaling.md). | 
| threadsCount > threshold | Maximum | The maximum expected threadsCount size during normal conditions. | You can use this metric to watch for thread leaks in task managers across the application. If this metric reaches this threshold, check your application code for threads being created without being closed. | 
| (oldGarbageCollectionTime \$1 100)/60\$1000 over 1 min period') > threshold | Maximum | The maximum expected oldGarbageCollectionTime duration. We recommend setting a threshold such that typical garbage collection time is 60 percent of the specified threshold, but the correct threshold for your application will vary. | If this metric is continually increasing, this can indicate that there is a memory leak in task managers across the application. | 
| RATE(oldGarbageCollectionCount)  > threshold | Maximum | The maximum expected oldGarbageCollectionCount under normal conditions. The correct threshold for your application will vary. | If this metric is continually increasing, this can indicate that there is a memory leak in task managers across the application. | 
| Operator.currentOutputWatermark - Operator.currentInputWatermark  > threshold | Minimum | The minimum expected watermark increment under normal conditions. The correct threshold for your application will vary. | If this metric is continually increasing, this can indicate that either the application is processing increasingly older events, or that an upstream subtask has not sent a watermark in an increasingly long time. | 

# 將自訂訊息寫入 CloudWatch Logs
<a name="cloudwatch-logs-writing"></a>

您可以將自訂訊息寫入 Managed Service for Apache Flink 應用程式的 CloudWatch 日誌。您可以使用 Apache [https://logging.apache.org/log4j/](https://logging.apache.org/log4j/) 程式庫或 [https://www.slf4j.org/](https://www.slf4j.org/) 程式庫來執行這項操作。

**Topics**
+ [使用 Log4J 寫入 CloudWatch 日誌](#cloudwatch-logs-writing-log4j)
+ [使用 SLF4J 寫入 CloudWatch 日誌](#cloudwatch-logs-writing-slf4j)

## 使用 Log4J 寫入 CloudWatch 日誌
<a name="cloudwatch-logs-writing-log4j"></a>

1. 將下列相依性新增至應用程式的 `pom.xml` 檔案：

   ```
   <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-api</artifactId>
       <version>2.6.1</version>
   </dependency>
   <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-core</artifactId>
       <version>2.6.1</version>
   </dependency>
   ```

1. 包括來自程式庫的物件：

   ```
   import org.apache.logging.log4j.Logger;
   ```

1. 具現化 `Logger` 物件，傳入你的應用程式類別：

   ```
   private static final Logger log = LogManager.getLogger.getLogger(YourApplicationClass.class);
   ```

1. 使用 `log.info` 寫入日誌。大量訊息會寫入應用程式日誌。若要讓您的自訂訊息更易於篩選，請使用 `INFO` 應用程式日誌層級。

   ```
   log.info("This message will be written to the application's CloudWatch log");
   ```

應用程式會將記錄寫入日誌，並顯示類似如下的訊息：

```
{
  "locationInformation": "com.amazonaws.services.managed-flink.StreamingJob.main(StreamingJob.java:95)", 
  "logger": "com.amazonaws.services.managed-flink.StreamingJob", 
  "message": "This message will be written to the application's CloudWatch log", 
  "threadName": "Flink-DispatcherRestEndpoint-thread-2", 
  "applicationARN": "arn:aws:kinesisanalyticsus-east-1:123456789012:application/test", 
  "applicationVersionId": "1", "messageSchemaVersion": "1", 
  "messageType": "INFO" 
}
```

## 使用 SLF4J 寫入 CloudWatch 日誌
<a name="cloudwatch-logs-writing-slf4j"></a>

1. 將下列相依性新增至應用程式的 `pom.xml` 檔案：

   ```
   <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-log4j12</artifactId>
       <version>1.7.7</version>
       <scope>runtime</scope>
   </dependency>
   ```

1. 包括來自程式庫的物件：

   ```
   import org.slf4j.Logger;
   import org.slf4j.LoggerFactory;
   ```

1. 具現化 `Logger` 物件，傳入你的應用程式類別：

   ```
   private static final Logger log = LoggerFactory.getLogger(YourApplicationClass.class);
   ```

1. 使用 `log.info` 寫入日誌。大量訊息會寫入應用程式日誌。若要讓您的自訂訊息更易於篩選，請使用 `INFO` 應用程式日誌層級。

   ```
   log.info("This message will be written to the application's CloudWatch log");
   ```

應用程式會將記錄寫入日誌，並顯示類似如下的訊息：

```
{
  "locationInformation": "com.amazonaws.services.managed-flink.StreamingJob.main(StreamingJob.java:95)", 
  "logger": "com.amazonaws.services.managed-flink.StreamingJob", 
  "message": "This message will be written to the application's CloudWatch log", 
  "threadName": "Flink-DispatcherRestEndpoint-thread-2", 
  "applicationARN": "arn:aws:kinesisanalyticsus-east-1:123456789012:application/test", 
  "applicationVersionId": "1", "messageSchemaVersion": "1", 
  "messageType": "INFO" 
}
```

# 使用 記錄 Managed Service for Apache Flink API 呼叫 AWS CloudTrail
<a name="logging-using-cloudtrail"></a>

Managed Service for Apache Flink 已與 整合 AWS CloudTrail，此服務提供使用者、角色或 Managed Service for Apache Flink 中 AWS 服務所採取動作的記錄。CloudTrail 會將 Managed Service for Apache Flink 的所有 API 呼叫擷取為事件。擷取的呼叫包括來自 Managed Service for Apache Flink 主控台的呼叫，以及對 Managed Service for Apache Flink API 操作的程式碼呼叫。如果您建立追蹤，就可以將 CloudTrail 事件持續交付到 Amazon S3 儲存貯體，包括 Managed Service for Apache Flink 的事件。即使您未設定追蹤，依然可以透過 CloudTrail 主控台中的**事件歷史記錄**檢視最新事件。您可以利用 CloudTrail 所收集的資訊來判斷向 Managed Service for Apache Flink 發出的請求，以及發出請求的 IP 地址、人員、時間和其他詳細資訊。

若要進一步了解 CloudTrail，請參閱[「AWS CloudTrail 使用者指南」](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)。

## CloudTrail 中的 Managed Service for Apache Flink 資訊
<a name="service-name-info-in-cloudtrail"></a>

當您建立 AWS 帳戶時，會在您的帳戶上啟用 CloudTrail。當活動在 Managed Service for Apache Flink 中發生時，該活動會與**事件歷史記錄**中的其他 AWS 服務事件一起記錄在 CloudTrail 事件中。您可以在 AWS 帳戶中檢視、搜尋和下載最近的事件。如需詳細資訊，請參閱《使用 CloudTrail 事件歷史記錄檢視事件》[https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)。

若要持續記錄您 AWS 帳戶中的事件，包括 Managed Service for Apache Flink 的事件，請建立追蹤。*線索*能讓 CloudTrail 將日誌檔案交付至 Amazon S3 儲存貯體。根據預設，當您在主控台中建立線索時，線索會套用至所有 AWS 區域。線索會記錄 AWS 分割區中所有區域的事件，並將日誌檔案交付至您指定的 Amazon S3 儲存貯體。此外，您可以設定其他 AWS 服務，以進一步分析和處理 CloudTrail 日誌中所收集的事件資料。如需詳細資訊，請參閱下列內容：
+ [建立追蹤的概觀](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)
+ [CloudTrail 支援的服務和整合](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-aws-service-specific-topics.html#cloudtrail-aws-service-specific-topics-integrations)
+ [設定 CloudTrail 的 Amazon SNS 通知](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/getting_notifications_top_level.html)
+ [從多個區域接收 CloudTrail 日誌檔案](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html)，以及[從多個帳戶接收 CloudTrail 日誌檔案](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-receive-logs-from-multiple-accounts.html)

CloudTrail 會記錄所有 Managed Service for Apache Flink 動作，這些動作也會記載在 [Managed Service for Apache Flink API 參考](/managed-flink/latest/apiv2/Welcome.html)中。例如，對 `[CreateApplication](/managed-flink/latest/apiv2/API_CreateApplication.html)` 以及 ` [UpdateApplication](/managed-flink/latest/apiv2/API_UpdateApplication.html)` 動作發出的呼叫會在 CloudTrail 日誌檔案中產生項目。

每一筆事件或日誌專案都會包含產生請求者的資訊。身分資訊可協助您判斷下列事項：
+ 是否使用根或 AWS Identity and Access Management (IAM) 使用者登入資料提出請求。
+ 提出該請求時，是否使用了特定角色或聯合身分使用者的暫時安全憑證。
+ 請求是否由其他 AWS 服務提出。

如需詳細資訊，請參閱 [CloudTrail userIdentity 元素](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html)。

## 了解 Managed Service for Apache Flink 日誌檔案項目
<a name="understanding-service-name-entries"></a>

追蹤是一種組態，能讓事件以日誌檔案的形式交付到您指定的 Amazon S3 儲存貯體。CloudTrail 日誌檔案包含一或多個日誌專案。一個事件為任何來源提出的單一請求，並包含請求動作、請求的日期和時間、請求參數等資訊。CloudTrail 日誌檔並非依公有 API 呼叫的堆疊追蹤排序，因此不會以任何特定順序出現。

以下範例為展示了 [AddApplicationCloudWatchLoggingOption](/managed-flink/latest/apiv2/API_AddApplicationCloudWatchLoggingOption.html) 和 [DescribeApplication](/managed-flink/latest/apiv2/API_DescribeApplication.html) 的 CloudTrail 日誌項目。

```
{
    "Records": [
        {
            "eventVersion": "1.05",
            "userIdentity": {
                "type": "IAMUser",
                "principalId": "EX_PRINCIPAL_ID",
                "arn": "arn:aws:iam::012345678910:user/Alice",
                "accountId": "012345678910",
                "accessKeyId": "EXAMPLE_KEY_ID",
                "userName": "Alice"
            },
            "eventTime": "2019-03-07T01:19:47Z",
            "eventSource": "kinesisanlaytics.amazonaws.com",
            "eventName": "AddApplicationCloudWatchLoggingOption",
            "awsRegion": "us-east-1",
            "sourceIPAddress": "127.0.0.1",
            "userAgent": "aws-sdk-java/unknown-version Linux/x.xx",
            "requestParameters": {
                "applicationName": "cloudtrail-test",
                "currentApplicationVersionId": 1,
                "cloudWatchLoggingOption": {
                    "logStreamARN": "arn:aws:logs:us-east-1:012345678910:log-group:cloudtrail-test:log-stream:flink-cloudwatch"
                }
            },
            "responseElements": {
                "cloudWatchLoggingOptionDescriptions": [
                    {
                        "cloudWatchLoggingOptionId": "2.1",
                        "logStreamARN": "arn:aws:logs:us-east-1:012345678910:log-group:cloudtrail-test:log-stream:flink-cloudwatch"
                    }
                ],
                "applicationVersionId": 2,
                "applicationARN": "arn:aws:kinesisanalyticsus-east-1:012345678910:application/cloudtrail-test"
            },
            "requestID": "18dfb315-4077-11e9-afd3-67f7af21e34f",
            "eventID": "d3c9e467-db1d-4cab-a628-c21258385124",
            "eventType": "AwsApiCall",
            "apiVersion": "2018-05-23",
            "recipientAccountId": "012345678910"
        },
        {
            "eventVersion": "1.05",
            "userIdentity": {
                "type": "IAMUser",
                "principalId": "EX_PRINCIPAL_ID",
                "arn": "arn:aws:iam::012345678910:user/Alice",
                "accountId": "012345678910",
                "accessKeyId": "EXAMPLE_KEY_ID",
                "userName": "Alice"
            },
            "eventTime": "2019-03-12T02:40:48Z",
            "eventSource": "kinesisanlaytics.amazonaws.com",
            "eventName": "DescribeApplication",
            "awsRegion": "us-east-1",
            "sourceIPAddress": "127.0.0.1",
            "userAgent": "aws-sdk-java/unknown-version Linux/x.xx",
            "requestParameters": {
                "applicationName": "sample-app"
            },
            "responseElements": null,
            "requestID": "3e82dc3e-4470-11e9-9d01-e789c4e9a3ca",
            "eventID": "90ffe8e4-9e47-48c9-84e1-4f2d427d98a5",
            "eventType": "AwsApiCall",
            "apiVersion": "2018-05-23",
            "recipientAccountId": "012345678910"
        }
    ]
}
```