このページでは、HTTP リクエストテンプレートまたはメールテンプレートで使用できる定義済みの変数について説明します。トリガーイベントのコンテキストにおける変数の値は、実際のリクエストまたはメールを送信する際にポリシーエンジンによって置換されます。

変数名の形成

事前定義された変数名を形成するには、変数のベース名を対応する情報クラスのフィールドに結合します。ベース名は、対応する情報クラスのみとともに使用できます。たとえば、ベース名 action は情報クラス ActionInfo only とともに使用できます。

情報クラスに関連付けられているフィールドがない場合、ベース名を変数として使用します。たとえば、コントローラ URL をテンプレートで変数として使用するには、${controllerUrl} を使用します。

情報クラスに複数のフィールドが含まれる場合、1つのフィールドを選択してベース名と関連付けます。情報クラスと関連付けられているフィールドの一覧については、『 Info Class Fields』を参照してください。

次に例を示します。

  • アカウント名をテンプレートで変数として使用するには、ベース名「account」を EntityInfo クラスの [name] フィールドと組み合わせて、変数 ${account.name} を形成します。
  • アクションのトリガー時刻を変数として使用するには、ベース名「action」を ActionInfo クラスの [triggerTime] フィールドと組み合わせて、変数 ${action.triggerTime} を形成します。

変数名のセグメントを連結できます。この場合、情報クラスのフィールドタイプがさらに別の情報クラスになります。

例えば、最近のトリガーイベントが発生したアプリケーションの名前を使用するには、次のようにします。

  1. latestEvent  ベース名を、EventInfo クラスの application フィールドと組み合わせます。
  2. application フィールドのフィールドタイプは EntityInfo であり、これはさらに別の情報クラスであるため、EntityInfo クラスの name フィールドを選択します。
  3. 次のように、セグメントを末尾に追加して変数名を形成します。

    { <base name>.<field name of info class1>.<field name of info class2>}

    ${latestEvent.application.name}.

ベース名

この表では、定義済み変数に対するベース名と、対応する情報クラスについて説明しています。

ベース名説明情報クラス
accountアクションがトリガーされたアカウントEntityInfo
policyアクションをトリガーしたポリシーPolicyInfo
actionトリガーされたアクションActionInfo
topSeverityINFOWARN、または ERROR.NotificationSeverity
topSeverityImage重大度の画像またはアイコンImageInfo
notificationConfigTextメールアクションのみString
controllerUrlコントローラの URLString
appDynamicsIcon-ImageInfo
appDynamicsLogo-ImageInfo
latestEvent最新のトリガーイベントEventInfo
fullEventListアクションをトリガーしたイベントのリストList<EventInfo>
fullEventsByTypeMapアクションをトリガーしたイベントのリスト(タイプ別にグループ化)Map<String, List<EventInfo>>
clampLimit表示されるトリガーイベントの数を制限(オプション設定)
int
clampedクランプの制限が設定されている場合は Trueboolean
clampedEventListクランプされる場合の最近 n 件のトリガーイベントList<EventInfo>
clampedEventsByTypeMapクランプされる場合の最近 n 件のトリガーイベント(タイプ別にグループ化)Map<String, List<EventInfo>>

fullEventsNodeMap

メールおよび HTTP テンプレートで使用されるノードレベルの変数
Map<EventInfo, NodeTemplateVariables>

情報クラスフィールド

前の「ベース名」表から、適切なクラス内のフィールドを使用して、テンプレートで使用する変数を形成します。

class EventInfo {
  EventType eventType
  long id
  String guid
  String eventTypeKey
  Date eventTime
  String displayName
  String summaryMessage
  String eventMessage
  EntityInfo application
  EntityInfo tier
  EntityInfo node
  EntityInfo db
  List<EntityInfo> affectedEntities
  boolean healthRuleEvent
  EntityInfo anomaly // * Only defined in case of anomaly event
  EntityInfo healthRule // * Only defined when healthRuleEvent == true
  EntityInfo incident // * Only defined when healthRuleEvent == true
  boolean healthRuleViolationEvent
  NotificationSeverity severity
  ImageInfo severityImage
  boolean btPerformanceEvent // * true when eventType matches one of the BT performance event types
  String deepLink
}

class ImageInfo {
  String name
  String fileName
  String mimeContentRef
  String deepLink
}

class EntityInfo { 
  EntityType entityType 
  String entityTypeDisplayName 
  long id 
  String name 
} 


class ActionInfo extends EntityInfo {
 Date triggerTime 
} 


class PolicyInfo extends EntityInfo {
 boolean digest 
 digestDurationInMins 
}

class PolicyInfo {
  EntityType entityType
  String entityTypeDisplayName
  long id
  String name
  boolean digest
  int digestDurationInMins
}

class ActionInfo {
  EntityType entityType
  String entityTypeDisplayName
  long id
  String name
  Date triggerTime
}
enum NotificationSeverity { INFO, WARN, ERROR }
 
class NodeTemplateVariables {
    private long id;
    private String name;
    private long tierId;
    private String tierName;
    private long machineId;
    private String machineName;
    private boolean machineAgentPresent;
    private String machineAgentVersion;
    private boolean appAgentPresent;
    private String appAgentVersion;
    private String ipAddresses;
    private AgentType agentType;
}
CODE

private String ipAddresses フィールドには、IP アドレスではなくホスト名が含まれます。

最新のトリガーイベントに対する HTTP リクエストの例

http://myController:8080/controller/rest/applications/${latestEvent.application.name}/nodes/${latestEvent.node.name}
CODE


トリガーイベントのリストを反復処理する HTTP リクエストの例

#foreach(${event} in ${fullEventList})
  http://myController:8080/controller/rest/applications/${event.application.name}/nodes/${event.node.name}
#end
CODE

件名が動的に変わるメールの例

アプリケーションをモニタリングする複数の正常性ルールがあり、すべての正常性ルールについて 1 つのポリシーでメール通知を送信する場合、正しい情報を通知から検索するのが難しいことがあります。通知をトリガーしたイベントに基づいてメールの件名が動的に更新されるよう、変数を定義することができます。 

必ず、メール本文で件名の変数を定義し、件名フィールドにそれを含めてください。

Subject: $subject
Body:
...
 <!-- Subject changes dynamically based on the triggering event -->
#foreach(${events} in ${fullEventList}) 
#set($subject = ${events.eventType.toString()}) #end
...
CODE

メールの HTML 本文の例

AppDynamics はこのメールテンプレートを使用して、アプリケーションで発生したイベントの詳細を通知します。イベントタイプを有効にすることで、通知が必要なイベントの詳細をカスタマイズできます。

<!-- Default AppDynamics email template -->
 
#if( $!{notificationConfigText} != '' )
$!{notificationConfigText} 
#else
AppDynamics
#end
Event Notification for the "${latestEvent.application.name}" Application
Event Notification Name: ${policy.name}
Event Notification Severity: ${topSeverity}

Summary of events occurring during the ${policy.digestDurationInMins}+ minute(s) prior to ${action.triggerTime}:
## Summary table
|| Event Type | Count ||
## Copy this row for each event type and count
#foreach($eventTypeEntry in $fullEventsByTypeMap.entrySet())
|| ${eventTypeEntry.getKey()} | ${eventTypeEntry.getValue().size()} ||
#end

## Full List of Events
The following events occurred during the time frame:
#if ($clamped)
Warning: The event list has been clamped at ${clampLimit} results! Please see the event and/or request snapshot viewers for the full list of events.
#end
|| Event Time | Event Type | Severity | Tier | Node | Summary || 

#foreach($eventList in $clampedEventsByTypeMap.values())
  #foreach($event in $eventList)
    || ${event.eventTime} | ${event.displayName} | ${event.severity} | $!{event.db.name} | $!{event.tier.name} | $!{event.node.name} | ${event.summaryMessage} ||
  #end
#end
Event Notification from AppDynamics.
This is an auto-generated email summarizing events on the "${latestEvent.application.name}" application. You are receiving this because you are configured as a recipient on the "${policy.name}" event notification. This is not necessarily an exhaustive list of all events during this time frame. Only those event types enabled in the notification will appear in this message.
CODE

反復処理を使用してイベントの詳細を抽出する例

次の例では、eventList を反復処理して、指定された期間中に発生した各イベントの詳細を抽出します。

<h1>Summary of events occurring during the ${policy.digestDurationInMins}+ minute(s) prior to ${action.triggerTime}:</h1>

<table>

#foreach(${eventList} in ${fullEventsByTypeMap.values()})
  #foreach(${event} in ${eventList})

    <tr>
        <td>
            <!-- Event icon -->
            <img src="${event.severityImage.mimeContentRef}" alt="${event.severity}"/>
        </td>
        <td>
            <!-- Event name with event link -->
            <a href="${event.deepLink}">${event.displayName}</a>
        </td>
        <td>
            <!-- Event message -->
            ${event.eventMessage}
        </td>
    </tr>

  #end
#end

</table>
CODE

すべての変数を一覧表示するコードの例

<h1>variables below </h1>

${fullEventsNodeMap}

<h2>map elements below</h2>

#foreach(${value} in ${fullEventsNodeMap.values()})
${value}
${value.name}
#end
CODE

これらの定義済み変数ではすべてのニーズを満たせない場合、独自のカスタム変数を定義し、[Create Template] ペインでこれらのテンプレートに使用することができます。

定義済み変数の名前はカスタム変数には使用しないでください。