Windows Server AppFabric: tracking profile e monitoração de serviços – parte 3

Olá pessoal, tudo certo?

Alguns posts atrás, falamos sobre tracking profile para monitoração de workflows publicados no Windows Server AppFabric. Muita gente ficou interessada no cenário e me pediram alguns exemplos com código, para download e testes locais.

Assim, aqui temos um projeto de um WCF Workflow Service que usa no Web.Config uma seção de Tracking Probile. O desenho do workflow você vê abaixo:

image

No workflow acima, estamos recebendo dois valores, param_in1 e param_in2. Com esses valores, fazemos um cálculo qualquer na CodeActivity chamada CodeActivityCalcular. Como podemos ter um algum problema nesse cálculo, por exemplo, um Divisão por Zero ou outra exceção, fiz a chamada da CodeActivity via TryCatch.

Assim, as principais atividades deste workflow são:

  • RecebeParametros
  • TryCatchCodeActivityCalcular
  • EnviaResposta

Para essas atividades, estamos usando as seguintes variáveis e parâmetros importantes para a execução do workflow, que são:

image

Como vamos hospedar esse workflow no Windows Server AppFabric, gostaria de publicar os valores dessas variáveis no painel de eventos rastreados do AppFabric. Isso é feito através da definição de um novo tracking profile no Web.Config do serviço.

Dentro da seção de definição do novo tracking profile, podemos descrever as variáveis que vamos exportar em eventos específicos de algumas atividades, como vemos no trecho de Web.Config a seguir:

    1: <tracking>
    2:   <profiles>
    3:     <trackingProfile name="CalcServiceTracked Tracking Profile">
    4:       <workflow activityDefinitionId="*">
    5:  
    6:         <workflowInstanceQueries>
    7:           <workflowInstanceQuery>
    8:             <states>
    9:               <state name="*" />
   10:             </states>
   11:           </workflowInstanceQuery>
   12:         </workflowInstanceQueries>
   13:  
   14:         <activityStateQueries>
   15:           <activityStateQuery activityName="RecebeParametros">
   16:             <states>
   17:               <state name="Closed" />
   18:             </states>
   19:             <variables>
   20:               <variable name="param_in1" />
   21:               <variable name="param_in2" />
   22:               <variable name="param_out" />
   23:             </variables>
   24:           </activityStateQuery>
   25:  
   26:           <activityStateQuery activityName="TryCatchCodeActivityCalcular">
   27:             <states>
   28:               <state name="Closed" />
   29:             </states>
   30:             <variables>
   31:               <variable name="param_in1" />
   32:               <variable name="param_in2" />
   33:               <variable name="param_out" />
   34:               <variable name="param_error" />
   35:             </variables>
   36:           </activityStateQuery>
   37:  
   38:           <activityStateQuery activityName="EnviaResposta">
   39:             <states>
   40:               <state name="Closed" />
   41:             </states>
   42:             <variables>
   43:               <variable name="param_in1" />
   44:               <variable name="param_in2" />
   45:               <variable name="param_out" />
   46:             </variables>
   47:           </activityStateQuery>
   48:  
   49:         </activityStateQueries>
   50:  
   51:         <faultPropagationQueries>
   52:           <faultPropagationQuery faultSourceActivityName="*" faultHandlerActivityName="*" />
   53:         </faultPropagationQueries>
   54:  
   55:         <bookmarkResumptionQueries>
   56:           <bookmarkResumptionQuery name="*" />
   57:         </bookmarkResumptionQueries>
   58:  
   59:         <customTrackingQueries>
   60:           <customTrackingQuery name="*" activityName="*" />
   61:         </customTrackingQueries>
   62:  
   63:       </workflow>
   64:     </trackingProfile>
   65:   </profiles>
   66: </tracking>

Veja, definimos no trecho acima o trackingProfile chamado “CalcServiceTracked Tracking Profile”. Nesse profile, estamos identificando algumas variáveis e atividades que são capturadas no tracking do AppFabric, como vemos no exemplo abaixo:

    1: <activityStateQuery activityName="TryCatchCodeActivityCalcular">
    2:   <states>
    3:     <state name="Closed" />
    4:   </states>
    5:   <variables>
    6:     <variable name="param_in1" />
    7:     <variable name="param_in2" />
    8:     <variable name="param_out" />
    9:     <variable name="param_error" />
   10:   </variables>
   11: </activityStateQuery>

Além dessas definições, precisamos indicar no topo do Web.Config que vamos usar esse novo tracking profile criado, como a seguinte seção:

    1: <behaviors>
    2:   <serviceBehaviors>
    3:  
    4:     <behavior>
    5:       <serviceMetadata httpGetEnabled="true" />
    6:       <serviceDebug includeExceptionDetailInFaults="false" />
    7:  
    8:       <!-- Definindo o tracking profile que iremos utilizar -->
    9:       <etwTracking profileName="CalcServiceTracked Tracking Profile" />
   10:  
   11:     </behavior>
   12:   </serviceBehaviors>
   13: </behaviors>
   14: <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
   15:  
   16: <diagnostics>
   17:   <!-- Configurando o detalhamento de atividades do endToEndTracing -->
   18:   <endToEndTracing propagateActivity="true" activityTracing="true" messageFlowTracing="true" />
   19: </diagnostics>

Fazendo essa configuração, podemos monitorar as variáveis rastreadas na tela de eventos do AppFabric, como vemos a seguir:

image

Na foto acima, vemos as três variáveis rastreadas na atividade EnviaResposta, sendo possível acompanhar os valores de param_in1, param_in2 e param_out.

Se você gostou do projeto, faço o download e testes você mesmo!

Por enquanto é só!Até o próximo post :)

Waldemir.