1
votes

applications azure logic: attendre la fin d'un conteneur ACI pour obtenir ses journaux

J'ai une application logique Azure qui crée correctement une instance de conteneur Azure. Le conteneur démarre, fait son travail et se termine. Je dois collecter ses journaux avec le connecteur approprié et les écrire dans un blob azure.

J'ai toutes les pièces en place mais je ne sais pas comment attendre que le conteneur se termine avant d'utiliser le connecteur "get logs of container" pour collecter les logs.

Si le travail de conteneur durait un laps de temps prévisible, je pourrais utiliser le connecteur Delay avant d'obtenir les journaux et cela suffirait (j'ai essayé avec des travaux courts et cela fonctionne bien). Mais mes travaux peuvent durer plusieurs heures, en fonction de certains facteurs externes, donc la technique du délai ne fonctionne pas.

J'ai essayé avec le connecteur "Until", avec delay et le conteneur "get properties of a container group" pour attendre que l'état du conteneur ne soit pas "terminé", mais sans succès (peut-être que je l'ai fait mal). Quoi qu'il en soit, cela peut être assez cher, puisque chaque "chèque" est facturé.

Comment puis-je attendre que le conteneur se termine avant de demander ses journaux?

merci.


0 commentaires

4 Réponses :


-1
votes

Une fois qu'un conteneur se termine, tout est perdu. Vous pouvez installer les conteneurs log-analytics à partir du marché Azure pour la journalisation et la journalisation avant la fin du conteneur


1 commentaires

lorsqu'un conteneur se termine, rien n'est perdu: vous pouvez facilement lire ses logs, par exemple, si vous ne supprimez pas le groupe de conteneurs.



2
votes

Si vous souhaitez obtenir les journaux d'un groupe de conteneurs et que personne ne sait quand il peut se terminer. Dans l'application logique, vous pouvez utiliser une variable pour stocker l'état du groupe de conteneurs, puis utiliser un contrôle jusqu'à la boucle qui obtiendra la fin du groupe de conteneurs jusqu'à ce qu'elle se réalise.

Voici les étapes:

  1. Créer un groupe de conteneurs;
  2. Obtenir l'état de mise à disposition du groupe de conteneurs;
  3. Initialisez une variable pour stocker l'état de mise à disposition du groupe de conteneurs;
  4. Dans untile, récupérez l'état de mise à disposition du groupe de conteneurs jusqu'à ce que l'état soit égal à terminer;
  5. Obtenez les journaux du groupe de conteneurs.

Toute la structure:

 entrez la description de l'image ici

La variable Initialize et les étapes Jusqu'à:

 entrez la description de l'image ici


1 commentaires

c'est un excellent point de départ, même s'il ne fonctionne pas entièrement pour mes objectifs. Veuillez consulter ma réponse pour plus de détails. Merci.



0
votes

Puisque vous avez mentionné que l'utilisation de "Until" dans l'application logique peut être coûteuse, je vous propose ici une autre solution pour votre référence.

Nous pouvons créer un time trigger azure function et définissez l'expression cron toutes les 1 minutes, créer un plan de service (niveau gratuit) pour la fonction, nous n'avons donc pas besoin de payer pour le coût de fonctionnement de la fonction (mais peut payer pour le stockage de la fonction).

La fonction s'exécutera toutes les 1 minute. En fonction, nous devons obtenir les propriétés du conteneur en utilisant cette reste api, puis si l'état est "terminé", appelez la demande d'application logique pour déclencher l'application logique (l'application logique doit être créée en tant que " Lorsqu'une requête HTTP est reçue ").

Le le code de fonction (en local, avant d'être déployé sur azure) doit être comme ci-dessous:

using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace hurytimeFun
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

            //1. using rest api to get the properties of your container

            //2. if the state is "terminated"
                // call the logic app request to trigger the logic app
        }
    }
}

J'espère que cela vous aidera à résoudre votre problème ~


1 commentaires

cette méthode est cool et valide en général, mais pour mon cas, elle n'est pas applicable car j'ai de nombreuses applications logiques provisionnées par programme, et votre réponse nécessiterait un travail de coordination supplémentaire. Merci.



2
votes

à partir de la réponse de Charles Xu, la séquence correcte lors de la définition de la variable est entrez la description de l'image ici

cela utilise la variable d'instance de conteneur "state" au lieu de "provisioning state". Ce dernier concerne la création du groupe de conteneurs, le premier concerne l'état de l'instance de conteneur, ce dont j'ai besoin. J'ai ajouté un délai pour diminuer le nombre d'exécutions (payantes) du connecteur.


4 commentaires

Pourquoi ne pas accepter ma réponse au lieu de copier la solution pendant qu'elle vous aide à résoudre le problème?!


car il est incomplet et ne fonctionne pas tel quel. Je serai très heureux d'accepter votre réponse si vous la modifiez et la faites fonctionner comme prévu, par exemple en utilisant le bon paramètre (état) et le foreach obligatoire. Avoir une seule réponse complète, ce serait sûrement plus utile à la communauté, et c'est primordial. Merci.


Pourquoi ça ne marche pas? Si vous créez une seule instance et cela fonctionnerait bien. Je ne connaissais pas toutes les informations que vous voulez vraiment, personne ne le saura à part vous. Dans SO, la communauté ne peut fournir qu'une idée pour résoudre le problème, pas la réponse entière.


Je suis désolé @CharlesXu, mais c'est ce dont j'avais besoin: "Je ne sais pas comment attendre que le conteneur se termine". Votre réponse utile indique quand le conteneur est correctement déployé, pas quand il termine son exécution. En fait, vous avez demandé la propriété "provisioningState", pas la propriété "state". Le premier contient l'état de provisionnement, le second l'état d'exécution.