

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Fonctions de dépannage et de surveillance
<a name="monetization-functions-troubleshooting"></a>

Cette page vous aide à diagnostiquer les erreurs de fonctionnement courantes et à surveiller les performances des fonctions en production. La section de résolution des problèmes est organisée par symptôme : commencez par ce que vous observez, puis suivez la cause et corrigez le problème.

## Contrôle
<a name="monetization-functions-troubleshooting-monitoring"></a>

### CloudWatch métriques
<a name="monetization-functions-troubleshooting-cw-metrics"></a>

MediaTailor publie des métriques relatives à l'exécution des fonctions sur Amazon CloudWatch. Aucun opt-in n'est requis.

**Hook-level métriques** : un point de données par cycle de vie exécuté par un hook :


| Métrique | Description | Dimensions | 
| --- | --- | --- | 
| PreSessionInitHook.Invocations | Nombre d'exécutions de hameçons | ConfigurationName | 
| PreSessionInitHook.Errors | Nombre d'erreurs de crochet | ConfigurationName | 
| PreSessionInitHook.Latency | Temps d'exécution du hook (ms) | ConfigurationName | 
| PreAdsRequestHook.Invocations | Nombre d'exécutions de hameçons | ConfigurationName | 
| PreAdsRequestHook.Errors | Nombre d'erreurs de crochet | ConfigurationName | 
| PreAdsRequestHook.Latency | Temps d'exécution du hook (ms) | ConfigurationName | 

**Function-level métriques** : un point de données par exécution de fonction individuelle :


| Métrique | Description | Dimensions | 
| --- | --- | --- | 
| Function.Invocations | Nombre d'exécutions de fonctions | ConfigurationName, FunctionId, FunctionType, HookType | 
| Function.Errors | Nombre d'erreurs de fonctionnement | ConfigurationName, FunctionId, FunctionType, HookType | 
| Function.Latency | Temps d'exécution de la fonction (ms) | ConfigurationName, FunctionId, FunctionType, HookType | 

Pour plus de détails sur la configuration des alarmes et l'utilisation de ces métriques, consultez[Contrôle AWS Elemental MediaTailor avec Amazon CloudWatch Metrics](monitoring-cloudwatch-metrics.md).

### Événements de journaux
<a name="monetization-functions-troubleshooting-log-events"></a>

MediaTailor émet des événements de journal pour l'exécution de la fonction. Les événements d'erreur sont émis par défaut. Les événements terminés et récapitulatifs sont facultatifs.


| Type d’événement | Par défaut/ Opt-in | Groupe de journaux | Description | 
| --- | --- | --- | --- | 
| PRE\_SESSION\_INIT\_HOOK\_SUMMARY | Opt-in | Journal du manifeste | Résumé de l'exécution du hook (success/error) | 
| PRE\_SESSION\_INIT\_HOOK\_ERROR | Par défaut | Journal du manifeste | Défaillance du hook avec ErrorType et cause | 
| PRE\_SESSION\_INIT\_FUNCTION\_COMPLETED | Opt-in | Journal du manifeste | Fonction individuelle complétée par input/output | 
| PRE\_SESSION\_INIT\_FUNCTION\_ERROR | Par défaut | Journal du manifeste | Défaillance fonctionnelle individuelle | 
| PRE\_ADS\_REQUEST\_HOOK\_SUMMARY | Opt-in | Journal des interactions ADS | Résumé de l'exécution du hook (success/error) | 
| PRE\_ADS\_REQUEST\_HOOK\_ERROR | Par défaut | Journal des interactions ADS | Défaillance du hook avec ErrorType et cause | 
| PRE\_ADS\_REQUEST\_FUNCTION\_COMPLETED | Opt-in | Journal des interactions ADS | Fonction individuelle complétée par input/output | 
| PRE\_ADS\_REQUEST\_FUNCTION\_ERROR | Par défaut | Journal des interactions ADS | Défaillance fonctionnelle individuelle | 

Pour activer le journal des événements opt-in, voir[Contrôle AWS Elemental MediaTailor avec Amazon CloudWatch Metrics](monitoring-cloudwatch-metrics.md).

Utilisez le `eventId` champ pour corréler les événements au niveau du hook et au niveau de la fonction pour une même exécution.

Les requêtes Amazon CloudWatch Logs Insights suivantes filtrent les événements d'erreur fonctionnelle `eventId` afin de suivre une seule exécution :

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

## Résolution des problèmes
<a name="monetization-functions-troubleshooting-guide"></a>

Lorsqu'une fonction échoue, MediaTailor enregistre un `errorType` champ dans l'événement d'erreur. Utilisez ce champ pour identifier la classe de défaillance :


| Error type (Type d'erreur) | Description | 
| --- | --- | 
| SYNTAX\_ERROR | L'expression n'a pas pu être compilée ou a rencontré une erreur de type d'exécution | 
| RESOURCE\_LIMIT\_ERROR | L'expression a dépassé les limites de temps du processeur, de mémoire ou de profondeur de pile | 
| RESTRICTION\_ERROR | L'expression a utilisé une fonction bloquée ou la limite de taille de la charge utile en entrée a été dépassée | 
| TIMEOUT\_ERROR | L'exécution de la fonction a dépassé sa limite de temps | 
| VALIDATION\_ERROR | Le chemin de sortie cible un champ non inscriptible dans la portée du hook actuel | 
| INTERNAL\_ERROR | Défaillance de l'infrastructure non liée à la fonction | 

Les entrées sont organisées par symptôme et font référence à ces types d'erreur, le cas échéant.

### L'expression renvoie null de manière inattendue
<a name="monetization-functions-ts-null"></a>

**Symptôme :** une valeur de sortie que vous vous attendiez à renseigner est `null` ou est absente des paramètres du joueur.

**Causes possibles :**


| Cause | Comment identifier | Corriger | 
| --- | --- | --- | 
| Le champ de saisie n'existe pas à ce crochet du cycle de vie. | Vous l'avez référencé adsRequest.url dans une PRE\_SESSION\_INITIALIZATION fonction. Les données de demande ADS ne sont pas disponibles au début de la session. | Déplacez la fonction vers le crochet PRE\_ADS\_REQUEST du cycle de vie ou utilisez un autre champ de saisie. Consultez [Hooks de cycle de vie](monetization-functions-hooks.md). | 
| Le champ de saisie est absent des données de session. | Vous l'avez référencéplayer\_params.campaign\_id, mais le joueur n'a pas transmis ce paramètre lors de l'initialisation de la session. | $exists()À utiliser pour vérifier avant d'accéder :{%$exists(player\_params.campaign\_id) ? player\_params.campaign\_id : 'default'%}. | 
| Vous avez écrit un objet ou un tableau dans les paramètres du joueur ou dans la requête ADS. | Ces espaces de noms n'acceptent que des chaînes, des nombres et des booléens. Les objets et les tableaux sont filtrés. | Stockez des données complexes temp.\* et extrayez-en des chaînes, des nombres ou des booléens lors d'une étape ultérieure. | 

### `RESOURCE_LIMIT_ERROR` : Débordement de pile
<a name="monetization-functions-ts-stack-overflow"></a>

**Symptôme :** La fonction échoue avec `errorType: "RESOURCE_LIMIT_ERROR"` et`cause: "Stack overflow error"`.

**Cause :** L'expression a dépassé la profondeur de pile maximale de 100 niveaux. Cela se produit généralement avec des expressions conditionnelles (if/then/else) profondément imbriquées ou des affectations de variables complexes.

Cela signifie que l'expression comporte trop de niveaux d'imbrication MediaTailor pour être traitée.

**Correctif :** Simplifiez l'expression. Divisez une logique complexe en plusieurs entrées de sortie ou en plusieurs étapes dans un exécuteur séquentiel.

### `RESOURCE_LIMIT_ERROR` : délai d'expiration du processeur
<a name="monetization-functions-ts-cpu-timeout"></a>

**Symptôme :** La fonction échoue avec `errorType: "RESOURCE_LIMIT_ERROR"` et`cause: "Expression evaluation timeout: Check for infinite loop"`.

**Cause :** L'expression a dépassé la limite de temps du processeur de 100 ms. Cela peut se produire avec des expressions qui effectuent des calculs coûteux sur de grandes structures de données.

**Correctif :** réduisez la complexité de l'expression. Si vous traitez de grands tableaux, pensez à déplacer cette logique vers un service externe et à l'appeler avec une `HTTP_REQUEST` fonction.

### `RESTRICTION_ERROR : Fonction` non autorisée
<a name="monetization-functions-ts-function-not-allowed"></a>

**Symptôme :** La fonction échoue avec `errorType: "RESTRICTION_ERROR"` et`cause: "Function '<name>' is not allowed"`.

**Cause :** L'expression appelle une fonction JSonata qui ne figure pas dans la liste autorisée des 38 fonctions. Les exemples courants incluent `$filter``$reduce`,`$eval`,`$split`, et`$join`.

**Correctif :** Vérifiez `cause` dans le champ le nom de la fonction bloquée. Remplacez-le par une alternative autorisée. Consultez [Référence d'expression JSonata](monetization-functions-jsonata.md) la liste complète des 38 fonctions autorisées.

Les fonctions autorisées couramment utilisées incluent `$string``$number`,`$substring`,`$contains`, et`$encodeUrlComponent`.

### `RESTRICTION_ERROR : Expression` trop longue
<a name="monetization-functions-ts-expression-too-long"></a>

**Symptôme :** La fonction ne parvient pas à être créée ou mise à jour avec`cause: "Expression length <actual> exceeds limit <limit>"`.

**Cause :** une seule expression dépasse 1 000 caractères.

**Correctif :** Divisez l'expression en parties plus petites. Utilisez plusieurs entrées de sortie ou répartissez la logique en plusieurs étapes dans un exécuteur séquentiel. Utilisez la liaison variable (`:=`) pour éviter de répéter de longues sous-expressions.

### Erreur HTTP : le code d'état est nul
<a name="monetization-functions-ts-status-null"></a>

**Symptôme :** Dans le résultat d'une `HTTP_REQUEST` fonction, `response.statusCode` c'est`null`.

**Cause :** L'API externe était inaccessible, le délai de connexion a expiré ou une erreur réseau s'est produite. Lorsque cela se produit, MediaTailor définit `response.body` sur `null``null`, `response.statusCode` to et `response.text` to`"Internal Error"`.

**Correctif :** vérifiez toujours `response.statusCode` avant d'accéder aux données de réponse :

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

Cette expression vérifie si l'appel HTTP a renvoyé un code d'état 200. Si c'est le cas, il utilise la valeur de réponse. Dans le cas contraire, la valeur par défaut est rétablie.

Si cela se produit fréquemment, vérifiez si l'API externe est saine. Envisagez de l'augmenter `RequestTimeoutMilliseconds` si l'API est lente ou de la diminuer si vous souhaitez échouer rapidement.

### Erreur HTTP : le corps de la réponse est nul
<a name="monetization-functions-ts-body-null"></a>

**Symptôme :** 200 mais `response.statusCode` c'`response.body`est le cas`null`.

**Cause :** le corps de la réponse n'est pas un JSON valide ou dépasse 20 000 caractères. MediaTailor analyse uniquement les réponses JSON contenant jusqu'à 20 000 caractères. `response.body`

**Correctif :** à utiliser `response.text` comme solution de secours. Le `response.text` champ contient le corps de réponse brut tronqué à 20 000 caractères :

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

Si les données dont vous avez besoin dépassent la limite de 20 000 caractères, pensez à demander à l'API externe de renvoyer une réponse plus petite (par exemple, en demandant des champs spécifiques).

### Erreur HTTP : échec de la validation de l'URL
<a name="monetization-functions-ts-url-validation"></a>

**Symptôme :** La fonction échoue lors de l'exécution avec un message indiquant que l'URL est mal formée, utilise un schéma non valide ou dépasse la longueur maximale.

**Causes possibles :**


| Cause | Corriger | 
| --- | --- | 
| L'URL n'utilise pas http ouhttps. | Assurez-vous que l'expression d'URL produit une URL commençant par http:// ouhttps://. | 
| L'URL dépasse 2 048 caractères après évaluation de l'expression. | Raccourcissez l'URL. Déplacez de grandes valeurs de paramètres vers le corps de la requête à l'aide d'une méthode POST. | 
| L'URL est mal formée (il ne s'agit pas d'un URI valide). | Vérifiez la présence de caractères manquants ou supplémentaires dans l'expression. $encodeUrlComponent()À utiliser pour les valeurs des paramètres de requête susceptibles de contenir des caractères spéciaux. | 

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

**Symptôme :** La fonction échoue avec`errorType: "VALIDATION_ERROR"`. Cette erreur peut se produire au moment de la création (lorsque vous créez ou mettez à jour la fonction) ou au moment de l'exécution (lorsque la fonction s'exécute pendant une session).

**Causes possibles :**


| Cause | Exemple | Corriger | 
| --- | --- | --- | 
| La clé de sortie cible un espace de noms non accessible en écriture sur le hook actuel. | Écrire à adsRequest.url dans une fonction attachée àPRE\_SESSION\_INITIALIZATION. | Vérifiez quels espaces de noms de sortie sont autorisés lors de votre cycle de vie. PRE\_SESSION\_INITIALIZATIONautorise uniquementplayer\_params.\*. Déplacez la fonction sur le crochet approprié ou modifiez la clé de sortie. Consultez [Hooks de cycle de vie](monetization-functions-hooks.md). | 
| La clé de sortie utilise des caractères non valides. | Une clé de sortie comme player\_params.device type (avec un espace). Seuls les lettres, les chiffres, les traits de soulignement et les traits d'union sont autorisés. | Renommez la clé de sortie pour n'utiliser que des caractères valides. Par exemple, utilisez player\_params.device\_type plutôt. | 
| La clé de sortie ne commence pas par un préfixe valide. | Une clé de sortie comme custom.myValue au lieu de player\_params.myValue outemp.myValue. | Utilisez un préfixe de sortie valide : player\_params.\*temp.\*, ouadsRequest.\*. | 
| Une expression JSonata contient une erreur de syntaxe. | Un devis de clôture manquant ou une condition incomplète :{%session.id & %}. | Vérifiez l'expression pour détecter les guillemets manquants, les parenthèses non correspondantes ou les opérateurs non pris en charge tels que ou. ?? ?: | 
| Il manque un champ obligatoire dans une fonction HTTP\_REQUEST. | Le champ URL est vide ou la méthode n'est pas spécifiée. | Assurez-vous que les champs URL et méthode sont définis. La méthode doit être GET ouPOST. | 
| L'URL créée par l'expression n'est pas valide. | L'URL évaluée utilise un schéma non pris en charge, par exempleftp://, dépasse 2 048 caractères ou est mal formée. | Vérifiez que l'expression d'URL produit une https:// URL validehttp://. $encodeUrlComponent()À utiliser pour les valeurs des paramètres de requête susceptibles de contenir des caractères spéciaux. | 
| Un en-tête HTTP contient des caractères non valides ou utilise un nom restreint. | Une valeur d'en-tête contient des sauts de ligne, ou le nom de l'en-tête est host outransfer-encoding. | Supprimez les caractères non valides des valeurs d'en-tête. Évitez les noms d'en-tête restreints. Voir [REQUÊTE\_HTTP](monetization-functions-types-http-request.md) pour les limites d'en-têtes. | 

Vérifiez le `cause` champ dans le journal des erreurs : il identifie le champ ou l'expression qui a échoué à la validation.

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

**Symptôme :** La fonction échoue avec`errorType: "INTERNAL_ERROR"`.

**Cause :** Une défaillance de l'infrastructure n'est pas liée à la configuration de vos fonctions.

**Correctif :** Réessayez la demande. Si l'erreur persiste, contactez le AWS Support.