

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 함수 문제 해결 및 모니터링
<a name="monetization-functions-troubleshooting"></a>

이 페이지에서는 일반적인 함수 오류를 진단하고 프로덕션 환경에서 함수 성능을 모니터링할 수 있습니다. 문제 해결 섹션은 증상별로 구성되어 있습니다. 관찰한 내용부터 시작한 다음 원인을 따르고 수정합니다.

## 모니터링
<a name="monetization-functions-troubleshooting-monitoring"></a>

### CloudWatch 지표
<a name="monetization-functions-troubleshooting-cw-metrics"></a>

MediaTailor는 함수 실행에 대한 지표를 Amazon CloudWatch에 게시합니다. 옵트인이 필요하지 않습니다.

**후크 수준 지표 -** 수명 주기 후크 실행당 하나의 데이터 포인트:


| 지표 | 설명 | 측정 기준 | 
| --- | --- | --- | 
| PreSessionInitHook.Invocations | 후크 실행 수 | ConfigurationName | 
| PreSessionInitHook.Errors | 후크 오류 수 | ConfigurationName | 
| PreSessionInitHook.Latency | 후크 실행 시간(ms) | ConfigurationName | 
| PreAdsRequestHook.Invocations | 후크 실행 수 | ConfigurationName | 
| PreAdsRequestHook.Errors | 후크 오류 수 | ConfigurationName | 
| PreAdsRequestHook.Latency | 후크 실행 시간(ms) | ConfigurationName | 

**함수 수준 지표 -** 개별 함수 실행당 하나의 데이터 포인트:


| 지표 | 설명 | 측정 기준 | 
| --- | --- | --- | 
| Function.Invocations | 함수 실행 수 | ConfigurationName, FunctionId, FunctionType, HookType | 
| Function.Errors | 함수 오류 수 | ConfigurationName, FunctionId, FunctionType, HookType | 
| Function.Latency | 함수 실행 시간(ms) | ConfigurationName, FunctionId, FunctionType, HookType | 

경보 설정 및 이러한 지표 작업에 대한 자세한 내용은 섹션을 참조하세요[Amazon CloudWatch 지표 AWS Elemental MediaTailor 를 사용한 모니터링](monitoring-cloudwatch-metrics.md).

### 로그 이벤트
<a name="monetization-functions-troubleshooting-log-events"></a>

MediaTailor는 함수 실행을 위해 로그 이벤트를 내보냅니다. 오류 이벤트는 기본적으로 내보내집니다. 완료된 이벤트와 요약 이벤트는 옵트인됩니다.


| 이벤트 유형 | 기본 / 옵트인 | 로그 그룹: | 설명 | 
| --- | --- | --- | --- | 
| PRE\_SESSION\_INIT\_HOOK\_SUMMARY | 옵트인 | 매니페스트 로그 | 후크 실행 요약(성공/오류) | 
| PRE\_SESSION\_INIT\_HOOK\_ERROR | 기본값 | 매니페스트 로그 | errorType 및 원인과 함께 후크 실패 | 
| PRE\_SESSION\_INIT\_FUNCTION\_COMPLETED | 옵트인 | 매니페스트 로그 | 입력/출력으로 완료된 개별 함수 | 
| PRE\_SESSION\_INIT\_FUNCTION\_ERROR | 기본값 | 매니페스트 로그 | 개별 함수 실패 | 
| PRE\_ADS\_REQUEST\_HOOK\_SUMMARY | 옵트인 | ADS 상호 작용 로그 | 후크 실행 요약(성공/오류) | 
| PRE\_ADS\_REQUEST\_HOOK\_ERROR | 기본값 | ADS 상호 작용 로그 | errorType 및 원인과 함께 후크 실패 | 
| PRE\_ADS\_REQUEST\_FUNCTION\_COMPLETED | 옵트인 | ADS 상호 작용 로그 | 입력/출력으로 완료된 개별 함수 | 
| PRE\_ADS\_REQUEST\_FUNCTION\_ERROR | 기본값 | ADS 상호 작용 로그 | 개별 함수 실패 | 

옵트인 로그 이벤트를 활성화하려면 섹션을 참조하세요[Amazon CloudWatch 지표 AWS Elemental MediaTailor 를 사용한 모니터링](monitoring-cloudwatch-metrics.md).

`eventId` 필드를 사용하여 동일한 실행에 대한 후크 수준 이벤트와 함수 수준 이벤트를 상호 연관시킵니다.

다음 Amazon CloudWatch Logs Insights 쿼리는 함수 오류 이벤트를 로 필터링`eventId`하여 단일 실행을 추적합니다.

```
fields @timestamp, eventType, functionId, errorType, cause
| filter eventId = "5dc6f040-0f72-4e8c-a64e-25eeef62708c"
| sort @timestamp asc
```

## 문제 해결
<a name="monetization-functions-troubleshooting-guide"></a>

함수가 실패하면 MediaTailor는 오류 이벤트에 `errorType` 필드를 기록합니다. 이 필드를 사용하여 실패 클래스를 식별합니다.


| 오류 유형 | 설명 | 
| --- | --- | 
| SYNTAX\_ERROR | 표현식이 컴파일되지 않았거나 런타임 유형 오류가 발생했습니다. | 
| RESOURCE\_LIMIT\_ERROR | 표현식이 CPU 시간, 메모리 또는 스택 깊이 제한을 초과함 | 
| RESTRICTION\_ERROR | 표현식이 차단된 함수를 사용했거나 입력 페이로드 크기 제한을 초과했습니다. | 
| TIMEOUT\_ERROR | 함수 실행이 시간 제한을 초과했습니다. | 
| VALIDATION\_ERROR | 출력 경로는 현재 후크의 범위에서 쓸 수 없는 필드를 대상으로 합니다. | 
| INTERNAL\_ERROR | 함수와 관련이 없는 인프라 장애 | 

항목은 증상별로 구성되며 해당하는 경우 이러한 오류 유형을 참조합니다.

### 표현식이 예기치 않게 null을 반환합니다.
<a name="monetization-functions-ts-null"></a>

**증상:** 채워질 것으로 예상되는 출력 값이 플레이어 파라미터에서 `null` 이거나 누락되었습니다.

**가능한 원인:**


| 원인 | 식별 방법 | 수정 | 
| --- | --- | --- | 
| 이 수명 주기 후크에는 입력 필드가 없습니다. | PRE\_SESSION\_INITIALIZATION 함수adsRequest.url에서를 참조했습니다. 세션 시작 시 ADS 요청 데이터를 사용할 수 없습니다. | 함수를 PRE\_ADS\_REQUEST 수명 주기 후크로 이동하거나 다른 입력 필드를 사용합니다. [수명 주기 후크](monetization-functions-hooks.md)을(를) 참조하세요. | 
| 세션 데이터에서 입력 필드가 누락되었습니다. | 를 참조player\_params.campaign\_id했지만 플레이어가 세션 초기화 시 해당 파라미터를 전달하지 않았습니다. | $exists()를 사용하여에 액세스하기 전에 확인합니다{%$exists(player\_params.campaign\_id) ? player\_params.campaign\_id : 'default'%}. | 
| 플레이어 파라미터 또는 ADS 요청에 객체 또는 배열을 작성했습니다. | 이러한 네임스페이스는 문자열, 숫자 및 부울만 허용합니다. 객체와 배열이 필터링됩니다. | 복잡한 데이터를에 저장temp.\*하고 후속 단계에서 문자열, 숫자 또는 부울을 추출합니다. | 

### `RESOURCE_LIMIT_ERROR`: 스택 오버플로
<a name="monetization-functions-ts-stack-overflow"></a>

**증상:** `errorType: "RESOURCE_LIMIT_ERROR"` 및에서 함수가 실패합니다`cause: "Stack overflow error"`.

**원인:** 표현식이 100 레벨의 최대 스택 깊이를 초과했습니다. 이는 일반적으로 깊이 중첩된 조건부(if/then/else) 표현식 또는 복잡한 변수 할당에서 발생합니다.

즉, 표현식의 중첩 수준이 너무 많아 MediaTailor에서 처리할 수 없습니다.

**수정:** 표현식을 간소화합니다. 복잡한 로직을 순차적 실행기에서 여러 출력 항목 또는 여러 단계로 나눕니다.

### `RESOURCE_LIMIT_ERROR`: CPU 제한 시간
<a name="monetization-functions-ts-cpu-timeout"></a>

**증상:** `errorType: "RESOURCE_LIMIT_ERROR"` 및에서 함수가 실패합니다`cause: "Expression evaluation timeout: Check for infinite loop"`.

**원인:** 표현식이 100ms CPU 시간 제한을 초과했습니다. 이는 대규모 데이터 구조에 대해 비용이 많이 드는 계산을 수행하는 표현식에서 발생할 수 있습니다.

**수정:** 표현식의 복잡성을 줄입니다. 큰 배열을 처리하는 경우 해당 로직을 외부 서비스로 이동하고 `HTTP_REQUEST` 함수를 사용하여 호출하는 것이 좋습니다.

### `RESTRICTION_ERROR`: 함수가 허용되지 않음
<a name="monetization-functions-ts-function-not-allowed"></a>

**증상:** `errorType: "RESTRICTION_ERROR"` 및에서 함수가 실패합니다`cause: "Function '<name>' is not allowed"`.

**원인:** 표현식이 허용되는 38개 함수 목록에 없는 JSONata 함수를 호출합니다. 일반적인 예로는 `$filter`, `$reduce`, `$eval`, 및 `$split`가 있습니다`$join`.

**수정:** `cause` 필드에 차단된 함수 이름이 있는지 확인합니다. 이를 허용된 대안으로 바꿉니다. 허용되는 함수 38개의 전체 목록은 섹션을 참조[JSONata 표현식 참조](monetization-functions-jsonata.md)하세요.

일반적으로 사용되는 허용되는 함수는 `$string`, `$number`, `$substring`, 및 `$contains`입니다`$encodeUrlComponent`.

### `RESTRICTION_ERROR`: 표현식이 너무 깁니다.
<a name="monetization-functions-ts-expression-too-long"></a>

**증상:** 함수가를 사용하여 생성하거나 업데이트하지 못합니다`cause: "Expression length <actual> exceeds limit <limit>"`.

**원인:** 단일 표현식이 1,000자를 초과합니다.

**수정:** 표현식을 더 작은 부분으로 나눕니다. 여러 출력 항목을 사용하거나 순차적 실행기에서 여러 단계로 로직을 분할합니다. 변수 바인딩(`:=`)을 사용하여 긴 하위 표현식이 반복되지 않도록 합니다.

### HTTP 오류: 상태 코드가 null입니다.
<a name="monetization-functions-ts-status-null"></a>

**증상:** `HTTP_REQUEST` 함수의 출력에서는 `response.statusCode`입니다`null`.

**원인:** 외부 API에 연결할 수 없거나, 연결 시간이 초과되었거나, 네트워크 오류가 발생했습니다. 이 경우 MediaTailor는 `response.statusCode`를 `null`, `response.body`를 `null`,를 `response.text`로 설정합니다`"Internal Error"`.

**수정:** 응답 데이터에 액세스`response.statusCode`하기 전에 항상 확인하세요.

```
{%response.statusCode = 200 ? response.body.value : 'default'%}
```

이 표현식은 HTTP 호출이 200 상태 코드를 반환했는지 확인합니다. 그렇다면 응답 값을 사용합니다. 그렇지 않으면 기본값으로 돌아갑니다.

이 문제가 자주 발생하면 외부 API가 정상인지 확인합니다. API가 느린 `RequestTimeoutMilliseconds` 경우 늘리고 빠른 실패를 원하는 경우 줄이는 것이 좋습니다.

### HTTP 오류: 응답 본문이 null임
<a name="monetization-functions-ts-body-null"></a>

**증상:** `response.statusCode`는 200이지만 `response.body`입니다`null`.

**원인:** 응답 본문이 유효한 JSON이 아니거나 20,000자를 초과합니다. MediaTailor는 최대 20,000자의 JSON 응답만에 구문 분석합니다`response.body`.

**수정:**를 대체`response.text`로 사용합니다. `response.text` 필드에는 20,000자로 잘린 원시 응답 본문이 포함됩니다.

```
{%response.statusCode = 200 ? ($exists(response.body.id) ? response.body.id : $substring(response.text, 0, 100)) : 'error'%}
```

필요한 데이터가 20,000자 제한을 초과하는 경우 외부 API에 더 작은 응답을 반환하도록 요청하는 것이 좋습니다(예: 특정 필드 요청).

### HTTP 오류: URL 검증 실패
<a name="monetization-functions-ts-url-validation"></a>

**증상:** URL의 형식이 잘못되었거나 잘못된 체계를 사용하거나 최대 길이를 초과했다는 메시지와 함께 런타임 시 함수가 실패합니다.

**가능한 원인:**


| 원인 | 수정 | 
| --- | --- | 
| URL은 http 또는를 사용하지 않습니다https. | URL 표현식이 http:// 또는 로 시작하는 URL을 생성하는지 확인합니다https://. | 
| 표현식 평가 후 URL이 2,048자를 초과합니다. | URL을 줄입니다. POST 메서드를 사용하여 큰 파라미터 값을 요청 본문으로 이동합니다. | 
| URL의 형식이 잘못되었습니다(유효한 URI가 아님). | 표현식에 누락된 문자나 추가 문자가 있는지 확인합니다. 특수 문자를 포함할 수 있는 쿼리 파라미터 값에 $encodeUrlComponent()를 사용합니다. | 

### `VALIDATION_ERROR`
<a name="monetization-functions-ts-validation-error"></a>

**증상:** 함수가에서 실패합니다`errorType: "VALIDATION_ERROR"`. 이 오류는 작성 시(함수를 생성하거나 업데이트할 때) 또는 실행 시(세션 중에 함수가 실행될 때) 발생할 수 있습니다.

**가능한 원인:**


| 원인 | 예제 | 수정 | 
| --- | --- | --- | 
| 출력 키는 현재 후크에서 쓸 수 없는 네임스페이스를 대상으로 합니다. | 에 연결된 함수adsRequest.url에서에 쓰기PRE\_SESSION\_INITIALIZATION. | 수명 주기 후크에서 허용되는 출력 네임스페이스를 확인합니다.는 PRE\_SESSION\_INITIALIZATION만 허용합니다player\_params.\*. 함수를 올바른 후크로 이동하거나 출력 키를 변경합니다. [수명 주기 후크](monetization-functions-hooks.md)을(를) 참조하세요. | 
| 출력 키는 잘못된 문자를 사용합니다. | 와 같은 출력 키player\_params.device type(공백 포함). 문자, 숫자, 밑줄 및 하이픈만 허용됩니다. | 유효한 문자만 사용하도록 출력 키의 이름을 바꿉니다. 예를 들어 player\_params.device\_type 대신를 사용합니다. | 
| 출력 키는 유효한 접두사로 시작하지 않습니다. | player\_params.myValue 또는 custom.myValue 대신와 같은 출력 키입니다temp.myValue. | 유효한 출력 접두사 player\_params.\*, 또는 temp.\*를 사용합니다adsRequest.\*. | 
| JSONata 표현식에 구문 오류가 있습니다. | 닫는 따옴표가 누락되었거나 불완전한 조건부: {%session.id & %}. | 표현식에서 누락된 따옴표, 일치하지 않는 괄호 또는 ?? 또는와 같은 지원되지 않는 연산자를 검토합니다?:. | 
| HTTP\_REQUEST 함수에 필수 필드가 누락되었습니다. | URL 필드가 비어 있거나 메서드가 지정되지 않았습니다. | URL 및 메서드 필드가 설정되어 있는지 확인합니다. 메서드는 GET 또는 여야 합니다POST. | 
| 표현식으로 빌드된 URL이 잘못되었습니다. | 평가된 URL은와 같은 지원되지 않는 체계를 사용하거나ftp://, 2,048자를 초과하거나, 형식이 잘못되었습니다. | URL 표현식이 유효한 http:// 또는 https:// URL을 생성하는지 확인합니다. 특수 문자를 포함할 수 있는 쿼리 파라미터 값에 $encodeUrlComponent()를 사용합니다. | 
| HTTP 헤더에 잘못된 문자가 포함되어 있거나 제한된 이름을 사용합니다. | 헤더 값에 줄 바꿈이 포함되거나 헤더 이름이 host 또는 입니다transfer-encoding. | 헤더 값에서 잘못된 문자를 제거합니다. 제한된 헤더 이름을 사용하지 마세요. 헤더 제한은 섹션을 참조[HTTP\_REQUEST](monetization-functions-types-http-request.md)하세요. | 

오류 로그 이벤트의 `cause` 필드를 확인합니다. 즉, 검증에 실패한 필드 또는 표현식을 식별합니다.

### `INTERNAL_ERROR`
<a name="monetization-functions-ts-internal-error"></a>

**증상:** 함수가에서 실패합니다`errorType: "INTERNAL_ERROR"`.

**원인:** 함수 구성과 관련이 없는 인프라 장애가 발생했습니다.

**수정:** 요청을 다시 시도합니다. 오류가 지속되면 AWS Support에 문의하십시오.