Monitoring Distributed Applications in Operations Manager

One of the more complex Management Pack Authoring scenarios is monitoring distributed applications. I recently used the System Center 2012 Visual Studio Authoring Extensions (VSAE) to create a very complex, but generic, distributed application management pack. Hopefully this solution provides a useful example for the community.

Management Pack Summary

The distributed application is a fake application called Fabrikam. Fabrikam has a database (called Fabrikam) that contains information on the customers that subscribe to the Fabrikam product. Currently Fabrikam has four subscribers/customers. These customers are Contoso, Litware, Lucerne, and Northwind. Each customer has their own database which is also named the same as the customer. The management pack discovers each customer from the data in the Fabrikam database. Each Fabrikam customer subscribes to various add-on applications. Currently there are only 3 add-on applications which are called Adventure Works Cycles, Alpine Ski House, and Blue Yonder Airlines.

The monitoring is separated into two sections, infrastructure and applications. The infrastructure is simply a roll-up of the health of the customer database from the SQL Management Pack. The application side is custom monitoring that is done from a resource pool called the Fabrikam Monitoring Resource Pool. Rules and Monitors run against the applicable customer database looking for various “events” that are inserted by the fake add-on applications (Adventure Works Cycles, Alpine Ski House, and Blue Yonder Airlines). Each application also has an associated fake Windows service that runs on the SQL Server and I have included a discovery/monitor for this as well.

This management pack covers the following concepts

  1. Hosting and Containment Relationships
  2. Health Roll-up (Dependency Monitors)
  3. Synchronizing class structures between Service Manager and Operations Manager
  4. Inheritance
  5. Secure References
  6. Using icons in your management pack
  7. Monitoring custom classes from a resource pool
  8. Monitoring services remotely using WMI
  9. Querying a remote DB using the OleDBProbe and evaluating the results
  10. Making your VSAE solutions portable
  11. Creating multiple management packs for a single solution

To import this management pack into your lab follow the steps below

Restore the databases to your SQL Server

The distributed application uses databases as its discovery and monitoring source. Choose a SQL Server in your lab to restore these databases to.

  • Ensure the SQL Server is monitored by Operations Manager
  • Copy the *.bak files from the \Testing\ directory to your SQL Server
  • Open SQL Management Studio and connect to your SQL Server
  • Restore the databases
    • Right-click on Databases and choose Restore Database
    • Select Device, click the Ellipsis, click Add, select Contoso.bak, and click OK four times
    • Repeat the steps above for Fabrikam.bak, Litware.bak, Lucerne.bak, and Northwind.bak
  • Update your Fabrikam Database
    • Open a New Query in SQL Management Studio
    • Run the following query after replacing the MachineName with the netbios name of your SQL Server

use Fabrikam
update InstalledServices
set MachineName = 'mysqlserver'

    • Run the following queries after replacing the DBConnectionString with your SQL Server and Instance Name

use Fabrikam
update Customers
set DBConnectionString = 'Provider=sqloledb;Data Source=mysqlserver.fabrikam.com\i01;Initial Catalog=Contoso;Integrated Security=SSPI'
where CustomerName = 'Contoso'
update Customers
set DBConnectionString = 'Provider=sqloledb;Data Source=mysqlserver.fabrikam.com\i01;Initial Catalog=Litware;Integrated Security=SSPI'
where CustomerName = 'Litware'
update Customers
set DBConnectionString = 'Provider=sqloledb;Data Source=mysqlserver.fabrikam.com\i01;Initial Catalog=Lucerne;Integrated Security=SSPI'
where CustomerName = 'Lucerne'
update Customers
set DBConnectionString = 'Provider=sqloledb;Data Source=mysqlserver.fabrikam.com\i01;Initial Catalog=Northwind;Integrated Security=SSPI'
where CustomerName = 'Northwind'

  • Restart the Microsoft Monitoring Agent service on your SQL Server (this will ensure the new databases get discovered quickly)
  • Open the Operations Manager Console
  • Go to Monitoring\Microsoft SQL Server\Databases\Database State and ensure that the 5 new databases have been discovered

Import the management packs into Operations Manager

  • Open the \Build\Release\Custom.Example.MyDistributedApplication.Discovery.xml
  • Do a find/replace on sql2012\i02
    • Replace it with the name\instance of your SQL Server
  • Save the XML file
  • Note, this solution was built on Operations Manager 2012 R2 so the references use those versions of the MPs, although they technically aren’t a requirement but you won’t be able to import the MPs without recompiling the solution if you’re using a lower version.
  • Open the Operations Manager Console
  • Go to Administration, Management Packs, and click Import Management Packs…
  • Click Add\Add from Disk and select the following files from the Build\Release directory (pay attention to the file extension)
    • Custom.Example.MyDistributedApplication.Discovery.xml
    • Custom.Example.MyDistributedApplication.CMDB.Library.mp
    • Custom.Example.MyDistributedApplication.Library.mp
    • Custom.Example.MyDistributedApplication.Monitoring.mp
    • Custom.Example.MyDistributedApplication.Resources.mpb
  • Click Install
  • Go to Administration, Run As Configuration\Profiles\My Distributed Application Discovery RunAs Profile and add an account that has access to the Fabrikam database
  • Go to Administration, Run As Configuration\Profiles\My Distributed Application Monitoring RunAs Profile and add an account that has access to all the databases we imported

Verify that the distributed application is discovered

  • Open the Operations Manager Console
  • Go to Monitoring\Distributed Applications
  • Right-click on Fabrikam Environment and select Open\Diagram View
  • Your application should look similar to this:

image

  • Notice the icons in the diagram. I used the icon pack from the folks at Cireson.
  • If only the top two objects are discovered then you can try to speed things up by restarting the Microsoft Monitoring Agent on the servers in your Fabrikam Monitoring Resource Pool

Test the Solution

  • Try running the queries in the \Testing\TestQueries.sql file to generate errors within the distributed application. This simply inserts rows into the customer database.
 --Create Error Event in Adventure Works Cycles
insert into HealthData (ApplicationID, Message, Type, TimeStamp)
values (1, 'An Error has occurred', 2, GetDate())

--Create Healthy Event in Adventure Works Cycles
insert into HealthData (ApplicationID, Message, Type, TimeStamp)
values (1, 'Application is Healthy', 1, GetDate())

--Get last health event in Adventure Works Cycles
select top 1 Type, Message, TimeStamp from HealthData hd
join Applications app on app.ApplicationID = hd.ApplicationID
where app.ApplicationName = 'Adventure Works Cycles'
order by TimeStamp desc

--Create Error Event in Alpine Ski House
insert into HealthData (ApplicationID, Message, Type, TimeStamp)
values (2, 'An Error has occurred', 2, GetDate())

--Get last unhealthy health event in Alpine Ski House within last 5 minutes
select top 1 Type, Message, TimeStamp from HealthData hd
join Applications app on app.ApplicationID = hd.ApplicationID
where app.ApplicationName = 'Alpine Ski House'
and hd.Type = 2
and datediff(minute, hd.TimeStamp, GetDate()) < 5
order by TimeStamp desc

--Create Error Event in Blue Yonder Airlines
insert into HealthData (ApplicationID, Message, Type, TimeStamp)
values (3, 'An Error has occurred', 2, GetDate())

--Get all unhealthy health events in Blue Yonder Airlines within last 5 minutes
select Type, Message, TimeStamp from HealthData hd
join Applications app on app.ApplicationID = hd.ApplicationID
where app.ApplicationName = 'Blue Yonder Airlines'
and hd.Type = 2
and datediff(minute, hd.TimeStamp, GetDate()) < 5
order by TimeStamp desc

--Create Order Backlog in Adventure Works Cycles
insert into PerformanceData (ApplicationID, Object, Counter, Instance, Value, TimeStamp)
values (1, 'POS', 'Orders', 'Contoso', 11, GetDate())

--Clear Order Backlog in Adventure Works Cycles
insert into PerformanceData (ApplicationID, Object, Counter, Instance, Value, TimeStamp)
values (1, 'POS', 'Orders', 'Contoso', 10, GetDate())

--Get Last Order Backlog Counter in Adventure Works Cycles
select Object, Counter, Instance, Value, TimeStamp from PerformanceData pd
join Applications app on app.ApplicationID = pd.ApplicationID
where app.ApplicationName = 'Adventure Works Cycles'
and pd.Object = 'POS'
and pd.Counter = 'Orders'
order by TimeStamp desc

Management Pack Details

  • Custom.Example.MyDistributedApplication.CMDB.Library – Contains a class that exists in both Service Manager and Operations Manager
 <?xml version="1.0" encoding="utf-8"?>
<ManagementPack SchemaVersion="2.0" ContentReadable="true" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
  <Manifest>
    <Identity>
      <ID>Custom.Example.MyDistributedApplication.CMDB.Library</ID>
      <Version>1.0.0.1</Version>
    </Identity>
    <Name>My Distributed Application Service Manager Library</Name>
    <References>
      <Reference Alias="System">
        <ID>System.Library</ID>
        <Version>7.5.8501.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
    </References>
  </Manifest>
  <TypeDefinitions>
    <EntityTypes>
      <ClassTypes>
        <ClassType ID="Custom.Example.MyDistributedApplication.CMDB.Customer" Base="System!System.ConfigItem" Accessibility="Public" Abstract="false" Hosted="false" Singleton="false">
          <Property ID="CustomerID" Type="int" Key="true" MaxLength="256" MinLength="0" />
          <Property ID="CustomerName" Type="string" Key="false" MaxLength="256" MinLength="0" />
          <Property ID="CustomerLocation" Type="string" Key="false" MaxLength="256" MinLength="0" />
          <Property ID="ContractStartDate" Type="datetime" Key="false" MaxLength="256" MinLength="0" />
          <Property ID="ContractEndDate" Type="datetime" Key="false" MaxLength="256" MinLength="0" />
        </ClassType>
      </ClassTypes>
    </EntityTypes>
  </TypeDefinitions>
  <LanguagePacks>
    <LanguagePack ID="ENU" IsDefault="true">
      <DisplayStrings>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.CMDB.Customer">
          <Name>Fabrikam Customer</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.CMDB.Customer" SubElementID="CustomerID">
          <Name>Fabrikam Customer ID</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.CMDB.Customer" SubElementID="CustomerName">
          <Name>Fabrikam Customer Name</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.CMDB.Customer" SubElementID="CustomerLocation">
          <Name>Fabrikam Customer Location</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.CMDB.Customer" SubElementID="ContractStartDate">
          <Name>Fabrikam Contract Start Date</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.CMDB.Customer" SubElementID="ContractEndDate">
          <Name>Fabrikam Contract End Date</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.CMDB.Library">
          <Name>My Distributed Application Service Manager Library</Name>
          <Description>My Distributed Application Service Manager Library Management Pack</Description>
        </DisplayString>
      </DisplayStrings>
      <KnowledgeArticles></KnowledgeArticles>
    </LanguagePack>
  </LanguagePacks>
</ManagementPack>
  • Custom.Example.MyDistributedApplication.Discovery – Contains the discoveries for the solution
 <?xml version="1.0" encoding="utf-8"?><ManagementPack xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsl="https://www.w3.org/1999/XSL/Transform" ContentReadable="true" SchemaVersion="2.0" OriginalSchemaVersion="2.0">
  <Manifest>
    <Identity>
      <ID>Custom.Example.MyDistributedApplication.Discovery</ID>
      <Version>1.0.0.1</Version>
    </Identity>
    <Name>My Distributed Application Discovery</Name>
    <References>
      <Reference Alias="CMDBLibrary">
        <ID>Custom.Example.MyDistributedApplication.CMDB.Library</ID>
        <Version>1.0.0.0</Version>
        <PublicKeyToken>e24f5efd5fd6e660</PublicKeyToken>
      </Reference>
      <Reference Alias="DALibrary">
        <ID>Custom.Example.MyDistributedApplication.Library</ID>
        <Version>1.0.0.0</Version>
        <PublicKeyToken>e24f5efd5fd6e660</PublicKeyToken>
      </Reference>
      <Reference Alias="SQLLibrary">
        <ID>Microsoft.SQLServer.Library</ID>
        <Version>6.4.1.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="SC">
        <ID>Microsoft.SystemCenter.Library</ID>
        <Version>7.0.8433.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="Windows">
        <ID>Microsoft.Windows.Library</ID>
        <Version>7.5.8501.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="System">
        <ID>System.Library</ID>
        <Version>7.5.8501.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
    </References>
  </Manifest>
  <TypeDefinitions>
    <ModuleTypes>
      <DataSourceModuleType ID="Custom.Example.MyDistributedApplication.DataSource.DiscoverCustomer" Accessibility="Public" Batching="false">
        <Configuration><xsd:element xmlns:xsd="https://www.w3.org/2001/XMLSchema" minOccurs="1" name="IntervalSeconds" type="xsd:integer" /><xsd:element xmlns:xsd="https://www.w3.org/2001/XMLSchema" minOccurs="1" name="DBConnectionString" type="xsd:string" /></Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="DBConnectionString" Selector="$Config/DBConnectionString$" ParameterType="string" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider"><IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds><SyncTime /><ScriptName>DiscoverCustomer.ps1</ScriptName><ScriptBody>#Functions
function QuerySQL(
  [Parameter(Mandatory=$true)]
  $connectionString,
  [Parameter(Mandatory=$true)]
  $queryStatement,
  [Parameter(Mandatory=$true)]
  $timeout,
  [Parameter(Mandatory=$true)]
  $maxRows)
{   
  try
  {
    $connection = New-Object System.Data.OleDb.OleDbConnection $connectionString
    $connection.Open()
    $command = New-Object Data.OleDb.OleDbCommand $queryStatement,$connection
    $command.CommandTimeout = $timeout
    $adapter = New-Object System.Data.OleDb.OleDbDataAdapter $command
    $dataset = New-Object System.Data.DataSet
    [void] $adapter.Fill($dataSet)
    $dataSet.Tables | Select-Object -Expand Rows | select -First $maxRows
  }
  finally
  {
    $connection.Close()
  }   
}

function GetCustomers(
  [Parameter(Mandatory=$true)]
  $connectionString)
{
  #Get customers that have applications installed
  $query = 'select distinct cu.CustomerID, cu.CustomerName, cu.DBConnectionString from InstalledApplications ia
            join Customers cu on ia.CustomerID = cu.CustomerID
            join Applications ap on ia.ApplicationID = ap.ApplicationID
            order by CustomerID'
  $customers = @(QuerySQL -connectionString $connectionString -queryStatement $Query -timeout 300 -maxRows 1000)
  return $customers
}

#Main
$DBConnectionString = '$Config/DBConnectionString$'
$SourceID = '$MPElement$'
$ManagedEntityID = '$Target/Id$'

#Create Discovery Data
$API = New-Object -comObject 'MOM.ScriptAPI'
$DiscoveryData = $API.CreateDiscoveryData(0, $SourceId, $ManagedEntityId)

#Discover Customers
$Customers = GetCustomers -connectionString $DBConnectionString
foreach ($Customer in $Customers)
{
  #Add Customer Object to Discovered Data
  $CustomerInstance = $DiscoveryData.CreateClassInstance("$MPElement[Name='CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer']$")
  $CustomerInstance.AddProperty("$MPElement[Name='CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer']/CustomerID$", $Customer.CustomerID)
  $CustomerInstance.AddProperty("$MPElement[Name='CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer']/CustomerName$", $Customer.CustomerName)
  $CustomerInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $Customer.CustomerName)
  $DiscoveryData.AddInstance($CustomerInstance)

  #Add Applications Object to Discovered Data and Link it to Customer Object
  $ApplicationsInstance = $DiscoveryData.CreateClassInstance("$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Applications']$")
  $ApplicationsInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", ("{0} Applications" -f $Customer.CustomerName))
  $ApplicationsInstance.AddProperty("$MPElement[Name='CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer']/CustomerID$", $Customer.CustomerID)
  $DiscoveryData.AddInstance($ApplicationsInstance)

  #Add Infrastructure Object to Discovered Data and Link it to Customer Object
  $InfrastructureInstance = $DiscoveryData.CreateClassInstance("$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Infrastructure']$")
  $InfrastructureInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", ("{0} Infrastructure" -f $Customer.CustomerName))
  $InfrastructureInstance.AddProperty("$MPElement[Name='CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer']/CustomerID$", $Customer.CustomerID)
  $DiscoveryData.AddInstance($InfrastructureInstance)

  #Add SQL Database Relationship to Discovered Data and Link it to Infrastructure Object
  $connectionString = $Customer.DBConnectionString.Split(";")
  $databaseName = ($connectionString[2].Split("="))[1]
  $instanceName = ($connectionString[1].Split("\"))[1]
  $principalName = (($connectionString[1].Split("\"))[0]).Split("=")[1]
  $DatabaseInstance = $DiscoveryData.CreateClassInstance("$MPElement[Name='SQLLibrary!Microsoft.SQLServer.Database']$")
  $DatabaseInstance.AddProperty("$MPElement[Name='SQLLibrary!Microsoft.SQLServer.Database']/DatabaseName$", $databaseName)
  $DatabaseInstance.AddProperty("$MPElement[Name='SQLLibrary!Microsoft.SQLServer.ServerRole']/InstanceName$", $instanceName)
  $DatabaseInstance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $principalName)
  $DatabaseRelationshipInstance = $DiscoveryData.CreateRelationshipInstance("$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Relationship.InfrastructureContainsDatabase']$")
  $DatabaseRelationshipInstance.Source = $InfrastructureInstance
  $DatabaseRelationshipInstance.Target = $DatabaseInstance
  $DiscoveryData.AddInstance($DatabaseRelationshipInstance)
}

#Return Discovered Data to OM
$DiscoveryData</ScriptBody><TimeoutSeconds>300</TimeoutSeconds></DataSource>
            </MemberModules>
            <Composition>
              <Node ID="DS" />
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.Discovery.Data</OutputType>
      </DataSourceModuleType>
      <DataSourceModuleType ID="Custom.Example.MyDistributedApplication.DataSource.DiscoverApplication" Accessibility="Public" Batching="false">
        <Configuration><xsd:element xmlns:xsd="https://www.w3.org/2001/XMLSchema" minOccurs="1" name="IntervalSeconds" type="xsd:integer" /><xsd:element xmlns:xsd="https://www.w3.org/2001/XMLSchema" minOccurs="1" name="DBConnectionString" type="xsd:string" /><xsd:element xmlns:xsd="https://www.w3.org/2001/XMLSchema" minOccurs="1" name="ApplicationName" type="xsd:string" /><xsd:element xmlns:xsd="https://www.w3.org/2001/XMLSchema" minOccurs="1" name="ApplicationID" type="xsd:string" /><xsd:element xmlns:xsd="https://www.w3.org/2001/XMLSchema" minOccurs="1" name="ApplicationNameID" type="xsd:string" /><xsd:element xmlns:xsd="https://www.w3.org/2001/XMLSchema" minOccurs="1" name="ApplicationDBConnectionStringID" type="xsd:string" /><xsd:element xmlns:xsd="https://www.w3.org/2001/XMLSchema" minOccurs="1" name="ServiceID" type="xsd:string" /><xsd:element xmlns:xsd="https://www.w3.org/2001/XMLSchema" minOccurs="1" name="MachineNameID" type="xsd:string" /><xsd:element xmlns:xsd="https://www.w3.org/2001/XMLSchema" minOccurs="1" name="ServiceNameID" type="xsd:string" /><xsd:element xmlns:xsd="https://www.w3.org/2001/XMLSchema" minOccurs="1" name="ServicePortID" type="xsd:string" /></Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="DBConnectionString" Selector="$Config/DBConnectionString$" ParameterType="string" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider"><IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds><SyncTime /><ScriptName>DiscoverApplication.ps1</ScriptName><ScriptBody>#Functions
function QuerySQL(
  [Parameter(Mandatory=$true)]
  $connectionString,
  [Parameter(Mandatory=$true)]
  $queryStatement,
  [Parameter(Mandatory=$true)]
  $timeout,
  [Parameter(Mandatory=$true)]
  $maxRows)
{   
  try
  {
    $connection = New-Object System.Data.OleDb.OleDbConnection $connectionString
    $connection.Open()
    $command = New-Object Data.OleDb.OleDbCommand $queryStatement,$connection
    $command.CommandTimeout = $timeout
    $adapter = New-Object System.Data.OleDb.OleDbDataAdapter $command
    $dataset = New-Object System.Data.DataSet
    [void] $adapter.Fill($dataSet)
    $dataSet.Tables | Select-Object -Expand Rows | select -First $maxRows
  }
  finally
  {
    $connection.Close()
  }   
}

function GetApplications(
  [Parameter(Mandatory=$true)]
  $connectionString,
  [Parameter(Mandatory=$true)]
  $applicationName
  )
{
  #Get applications
  $query = (("select cu.CustomerID, cu.CustomerName, ap.ApplicationID, ap.ApplicationName from InstalledApplications ia
            join Customers cu on ia.CustomerID = cu.CustomerID
            join Applications ap on ia.ApplicationID = ap.ApplicationID
            where ApplicationName = '{0}'") -f $applicationName)
  $applications = @(QuerySQL -connectionString $connectionString -queryStatement $Query -timeout 300 -maxRows 1000)
  return $applications
}

function GetServices(
  [Parameter(Mandatory=$true)]
  $connectionString,
  [Parameter(Mandatory=$true)]
  $applicationName
  )
{
  #Get customers that have applications installed
  $query = (("select isvc.MachineName, isvc.ServiceName, isvc.Port, cu.CustomerID, cu.CustomerName, ap.ApplicationID, ap.ApplicationName from InstalledServices isvc
            join Customers cu on isvc.CustomerID = cu.CustomerID
            join Applications ap on isvc.ApplicationID = ap.ApplicationID
            where ApplicationName = '{0}'") -f $applicationName)
  $services = @(QuerySQL -connectionString $connectionString -queryStatement $Query -timeout 300 -maxRows 1000)
  return $services
}

#Main
$DBConnectionString = '$Config/DBConnectionString$'
$ApplicationName = '$Config/ApplicationName$'
$ApplicationID = '$Config/ApplicationID$'
$ApplicationNameID = '$Config/ApplicationNameID$'
$ApplicationDBConnectionStringID = '$Config/ApplicationDBConnectionStringID$'
$ServiceID = '$Config/ServiceID$'
$MachineNameID = '$Config/MachineNameID$'
$ServiceNameID = '$Config/ServiceNameID$'
$ServicePortID = '$Config/ServicePortID$'
$SourceID = '$MPElement$'
$ManagedEntityID = '$Target/Id$'

#Create Discovery Data
$API = New-Object -comObject 'MOM.ScriptAPI'
$DiscoveryData = $API.CreateDiscoveryData(0, $SourceId, $ManagedEntityId)

#Discover Applications
$Applications = GetApplications -connectionString $DBConnectionString -applicationName $ApplicationName
foreach ($Application in $Applications)
{
  #Add Application Object to Discovered Data and Link it to Customer Object
  $ApplicationInstance = $DiscoveryData.CreateClassInstance($ApplicationID)
  $ApplicationInstance.AddProperty("$MPElement[Name='CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer']/CustomerID$", $Application.CustomerID)
  $ApplicationInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $Application.ApplicationName)
  $ApplicationInstance.AddProperty($ApplicationNameID, $Application.ApplicationName)
  $ApplicationInstance.AddProperty($ApplicationDBConnectionStringID, ("Provider=sqloledb;Data Source=sql1\i01;Initial Catalog={0};Integrated Security=SSPI" -f $Application.CustomerName))
  $DiscoveryData.AddInstance($ApplicationInstance)
}

#Discover Services
$Services = GetServices -connectionString $DBConnectionString -applicationName $ApplicationName
foreach ($Service in $Services)
{
  #Add Service Object to Discovered Data and Link it to the Application Object
  $ServiceInstance = $DiscoveryData.CreateClassInstance($ServiceID)
  $ServiceInstance.AddProperty("$MPElement[Name='CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer']/CustomerID$", $Service.CustomerID)
  $ServiceInstance.AddProperty($ApplicationNameID, $Service.ApplicationName)
  $ServiceInstance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", ("{0} Service" -f $Service.ServiceName))
  $ServiceInstance.AddProperty($MachineNameID, $Service.MachineName)
  $ServiceInstance.AddProperty($ServiceNameID, $Service.ServiceName)
  $ServiceInstance.AddProperty($ServicePortID, $Service.Port)
  $DiscoveryData.AddInstance($ServiceInstance)
}

#Return Discovered Data to OM
$DiscoveryData</ScriptBody><TimeoutSeconds>300</TimeoutSeconds></DataSource>
            </MemberModules>
            <Composition>
              <Node ID="DS" />
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.Discovery.Data</OutputType>
      </DataSourceModuleType>
      <DataSourceModuleType ID="Custom.Example.MyDistributedApplication.DataSource.DiscoverResourcePool" Accessibility="Public" Batching="false">
        <Configuration><xsd:element xmlns:xsd="https://www.w3.org/2001/XMLSchema" name="IntervalSeconds" type="xsd:integer" /></Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="Scheduler" TypeID="System!System.Discovery.Scheduler"><Scheduler><SimpleReccuringSchedule><Interval>$Config/IntervalSeconds$</Interval><SyncTime /></SimpleReccuringSchedule><ExcludeDates /></Scheduler></DataSource>
              <ConditionDetection ID="Mapper" TypeID="System!System.Discovery.ClassSnapshotDataMapper"><ClassId>$MPElement[Name="SC!Microsoft.SystemCenter.ManagementServicePoolWatcher"]$</ClassId><InstanceSettings><Settings><Setting><Name>$MPElement[Name="SC!Microsoft.SystemCenter.ManagementServicePoolWatcher"]/PoolId$</Name><Value>$Target/Id$</Value></Setting><Setting><Name>$MPElement[Name="SC!Microsoft.SystemCenter.ManagementServicePoolWatcher"]/PoolName$</Name><Value>$Target/Property[Type="System!System.Entity"]/DisplayName$</Value></Setting><Setting><Name>$MPElement[Name="System!System.Entity"]/DisplayName$</Name><Value>$Target/Property[Type="System!System.Entity"]/DisplayName$ Watcher</Value></Setting></Settings></InstanceSettings></ConditionDetection>
            </MemberModules>
            <Composition>
              <Node ID="Mapper">
                <Node ID="Scheduler" />
              </Node>
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.Discovery.Data</OutputType>
      </DataSourceModuleType>
    </ModuleTypes>
  </TypeDefinitions>
  <Monitoring>
    <Discoveries>
      <Discovery ID="Custom.Example.MyDistributedApplication.Discovery.DiscoverAdventureWorksCycles" Enabled="true" Target="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer" ConfirmDelivery="true" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="DALibrary!Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles" />
          <DiscoveryClass TypeID="DALibrary!Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles.Service" />
        </DiscoveryTypes>
        <DataSource ID="DS" RunAs="DALibrary!Custom.Example.MyDistributedApplication.SecureReference.DiscoveryProfile" TypeID="Custom.Example.MyDistributedApplication.DataSource.DiscoverApplication"><IntervalSeconds>86400</IntervalSeconds><DBConnectionString>Provider=sqloledb;Data Source=sql1\i01;Initial Catalog=Fabrikam;Integrated Security=SSPI</DBConnectionString><ApplicationName>Adventure Works Cycles</ApplicationName><ApplicationID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles']$</ApplicationID><ApplicationNameID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Application']/ApplicationName$</ApplicationNameID><ApplicationDBConnectionStringID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Application']/DBConnectionString$</ApplicationDBConnectionStringID><ServiceID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles.Service']$</ServiceID><MachineNameID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Service']/MachineName$</MachineNameID><ServiceNameID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Service']/ServiceName$</ServiceNameID><ServicePortID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Service']/Port$</ServicePortID></DataSource>
      </Discovery>
      <Discovery ID="Custom.Example.MyDistributedApplication.Discovery.DiscoverAlpineSkiHouse" Enabled="true" Target="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer" ConfirmDelivery="true" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="DALibrary!Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse" />
          <DiscoveryClass TypeID="DALibrary!Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse.Service" />
        </DiscoveryTypes>
        <DataSource ID="DS" RunAs="DALibrary!Custom.Example.MyDistributedApplication.SecureReference.DiscoveryProfile" TypeID="Custom.Example.MyDistributedApplication.DataSource.DiscoverApplication"><IntervalSeconds>86400</IntervalSeconds><DBConnectionString>Provider=sqloledb;Data Source=sql1\i01;Initial Catalog=Fabrikam;Integrated Security=SSPI</DBConnectionString><ApplicationName>Alpine Ski House</ApplicationName><ApplicationID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse']$</ApplicationID><ApplicationNameID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Application']/ApplicationName$</ApplicationNameID><ApplicationDBConnectionStringID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Application']/DBConnectionString$</ApplicationDBConnectionStringID><ServiceID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse.Service']$</ServiceID><MachineNameID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Service']/MachineName$</MachineNameID><ServiceNameID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Service']/ServiceName$</ServiceNameID><ServicePortID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Service']/Port$</ServicePortID></DataSource>
      </Discovery>
      <Discovery ID="Custom.Example.MyDistributedApplication.Discovery.DiscoverBlueYonderAirlines" Enabled="true" Target="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer" ConfirmDelivery="true" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="DALibrary!Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines" />
          <DiscoveryClass TypeID="DALibrary!Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines.Service" />
        </DiscoveryTypes>
        <DataSource ID="DS" RunAs="DALibrary!Custom.Example.MyDistributedApplication.SecureReference.DiscoveryProfile" TypeID="Custom.Example.MyDistributedApplication.DataSource.DiscoverApplication"><IntervalSeconds>86400</IntervalSeconds><DBConnectionString>Provider=sqloledb;Data Source=sql1\i01;Initial Catalog=Fabrikam;Integrated Security=SSPI</DBConnectionString><ApplicationName>Blue Yonder Airlines</ApplicationName><ApplicationID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines']$</ApplicationID><ApplicationNameID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Application']/ApplicationName$</ApplicationNameID><ApplicationDBConnectionStringID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Application']/DBConnectionString$</ApplicationDBConnectionStringID><ServiceID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines.Service']$</ServiceID><MachineNameID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Service']/MachineName$</MachineNameID><ServiceNameID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Service']/ServiceName$</ServiceNameID><ServicePortID>$MPElement[Name='DALibrary!Custom.Example.MyDistributedApplication.Service']/Port$</ServicePortID></DataSource>
      </Discovery>
      <Discovery ID="Custom.Example.MyDistributedApplication.Discovery.DiscoverFabrikam" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Fabrikam" ConfirmDelivery="true" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryRelationship TypeID="DALibrary!Custom.Example.MyDistributedApplication.Relationship.FabrikamContainsCustomers" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="SC!Microsoft.SystemCenter.GroupPopulator"><RuleId>$MPElement$</RuleId><GroupInstanceId>$Target/Id$</GroupInstanceId><MembershipRules><MembershipRule><MonitoringClass>$MPElement[Name="DALibrary!Custom.Example.MyDistributedApplication.Customers"]$</MonitoringClass><RelationshipClass>$MPElement[Name="DALibrary!Custom.Example.MyDistributedApplication.Relationship.FabrikamContainsCustomers"]$</RelationshipClass></MembershipRule></MembershipRules></DataSource>
      </Discovery>
      <Discovery ID="Custom.Example.MyDistributedApplication.Discovery.DiscoverCustomer" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Customers" ConfirmDelivery="true" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer" />
          <DiscoveryClass TypeID="DALibrary!Custom.Example.MyDistributedApplication.Applications" />
          <DiscoveryClass TypeID="DALibrary!Custom.Example.MyDistributedApplication.Infrastructure" />
          <DiscoveryClass TypeID="SQLLibrary!Microsoft.SQLServer.Database" />
          <DiscoveryRelationship TypeID="DALibrary!Custom.Example.MyDistributedApplication.Relationship.InfrastructureContainsDatabase" />
        </DiscoveryTypes>
        <DataSource ID="DS" RunAs="DALibrary!Custom.Example.MyDistributedApplication.SecureReference.DiscoveryProfile" TypeID="Custom.Example.MyDistributedApplication.DataSource.DiscoverCustomer"><IntervalSeconds>86400</IntervalSeconds><DBConnectionString>Provider=sqloledb;Data Source=sql1\i01;Initial Catalog=Fabrikam;Integrated Security=SSPI</DBConnectionString></DataSource>
      </Discovery>
      <Discovery ID="Custom.Example.MyDistributedApplication.Discovery.DiscoverResourcePool" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.ResourcePool" ConfirmDelivery="false" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="SC!Microsoft.SystemCenter.ManagementServicePoolWatcher">
            <Property TypeID="System!System.Entity" PropertyID="DisplayName" />
            <Property PropertyID="PoolId" />
            <Property PropertyID="PoolName" />
          </DiscoveryClass>
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="Custom.Example.MyDistributedApplication.DataSource.DiscoverResourcePool"><IntervalSeconds>86400</IntervalSeconds></DataSource>
      </Discovery>
      <Discovery ID="Custom.Example.MyDistributedApplication.Discovery.DiscoverCustomerManagedByResourcePool" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.ResourcePool" ConfirmDelivery="true" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryRelationship TypeID="SC!Microsoft.SystemCenter.ManagementActionPointShouldManageEntity" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="SC!Microsoft.SystemCenter.GroupPopulator"><RuleId>$MPElement$</RuleId><GroupInstanceId>$Target/Id$</GroupInstanceId><MembershipRules><MembershipRule><MonitoringClass>$MPElement[Name="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer"]$</MonitoringClass><RelationshipClass>$MPElement[Name="SC!Microsoft.SystemCenter.ManagementActionPointShouldManageEntity"]$</RelationshipClass></MembershipRule></MembershipRules></DataSource>
      </Discovery>
      <Discovery ID="Custom.Example.MyDistributedApplication.Discovery.DiscoverCustomers" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Customers" ConfirmDelivery="true" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryRelationship TypeID="DALibrary!Custom.Example.MyDistributedApplication.Relationship.CustomersContainsCustomer" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="SC!Microsoft.SystemCenter.GroupPopulator"><RuleId>$MPElement$</RuleId><GroupInstanceId>$Target/Id$</GroupInstanceId><MembershipRules><MembershipRule><MonitoringClass>$MPElement[Name="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer"]$</MonitoringClass><RelationshipClass>$MPElement[Name="DALibrary!Custom.Example.MyDistributedApplication.Relationship.CustomersContainsCustomer"]$</RelationshipClass></MembershipRule></MembershipRules></DataSource>
      </Discovery>
    </Discoveries>
  </Monitoring>
  <LanguagePacks>
    <LanguagePack ID="ENU" IsDefault="true">
      <DisplayStrings>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Discovery.DiscoverAdventureWorksCycles">
          <Name>Adventure Works Cycles Discovery</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Discovery.DiscoverAlpineSkiHouse">
          <Name>Alpine Ski House Discovery</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Discovery.DiscoverBlueYonderAirlines">
          <Name>Blue Yonder Airlines Discovery</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Discovery.DiscoverFabrikam">
          <Name>Fabrikam Discovery</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Discovery.DiscoverCustomer">
          <Name>Customer Discovery</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Discovery.DiscoverResourcePool">
          <Name>Resource Pool Discovery</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Discovery.DiscoverCustomerManagedByResourcePool">
          <Name>Customer Managed By Resource Pool Discovery</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Discovery.DiscoverCustomers">
          <Name>Customers Discovery</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Discovery">
          <Name>My Distributed Application Discovery</Name>
          <Description>My Distributed Application Discovery Management Pack</Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.DataSource.DiscoverCustomer">
          <Name>Discover Customer Data Source</Name>
          <Description>Used to discover the customer class</Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.DataSource.DiscoverCustomer" SubElementID="IntervalSeconds">
          <Name>IntervalSeconds</Name>
          <Description>The interval at which the discovery will be run</Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.DataSource.DiscoverCustomer" SubElementID="DBConnectionString">
          <Name>DBConnectionString</Name>
          <Description>The string to connect to the customer monitoring database</Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.DataSource.DiscoverResourcePool">
          <Name>Discover Resource Pool Data Source</Name>
          <Description>Used to discover the resource pool to be used for monitoring the distributed application</Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.DataSource.DiscoverResourcePool" SubElementID="IntervalSeconds">
          <Name>IntervalSeconds</Name>
          <Description>The interval at which the discovery will be run</Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.DataSource.DiscoverApplication">
          <Name>Discover Application Data Source</Name>
          <Description>Used to discover the application class</Description>
        </DisplayString>
      </DisplayStrings>
    </LanguagePack>
  </LanguagePacks>
</ManagementPack>
  • Custom.Example.MyDistributedApplication.Library – Contains the classes and relationships used in the solution
 <?xml version="1.0" encoding="utf-8"?>
<ManagementPack SchemaVersion="2.0" ContentReadable="true" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
  <Manifest>
    <Identity>
      <ID>Custom.Example.MyDistributedApplication.Library</ID>
      <Version>1.0.0.1</Version>
    </Identity>
    <Name>My Distributed Application Library</Name>
    <References>
      <Reference Alias="CMDBLibrary">
        <ID>Custom.Example.MyDistributedApplication.CMDB.Library</ID>
        <Version>1.0.0.0</Version>
        <PublicKeyToken>e24f5efd5fd6e660</PublicKeyToken>
      </Reference>
      <Reference Alias="SQLLibrary">
        <ID>Microsoft.SQLServer.Library</ID>
        <Version>6.4.1.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="SC">
        <ID>Microsoft.SystemCenter.Library</ID>
        <Version>7.0.8433.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="Windows">
        <ID>Microsoft.Windows.Library</ID>
        <Version>7.5.8501.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="System">
        <ID>System.Library</ID>
        <Version>7.5.8501.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
    </References>
  </Manifest>
  <TypeDefinitions>
    <EntityTypes>
      <ClassTypes>
        <ClassType ID="Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles" Base="Custom.Example.MyDistributedApplication.Application" Accessibility="Public" Abstract="false" Hosted="true" Singleton="false" />
        <ClassType ID="Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles.Service" Base="Custom.Example.MyDistributedApplication.Service" Accessibility="Public" Abstract="false" Hosted="true" Singleton="false" />
        <ClassType ID="Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse" Base="Custom.Example.MyDistributedApplication.Application" Accessibility="Public" Abstract="false" Hosted="true" Singleton="false" />
        <ClassType ID="Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse.Service" Base="Custom.Example.MyDistributedApplication.Service" Accessibility="Public" Abstract="false" Hosted="true" Singleton="false" />
        <ClassType ID="Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines" Base="Custom.Example.MyDistributedApplication.Application" Accessibility="Public" Abstract="false" Hosted="true" Singleton="false" />
        <ClassType ID="Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines.Service" Base="Custom.Example.MyDistributedApplication.Service" Accessibility="Public" Abstract="false" Hosted="true" Singleton="false" />
        <ClassType ID="Custom.Example.MyDistributedApplication.Fabrikam" Base="System!System.Service" Accessibility="Public" Abstract="false" Hosted="false" Singleton="true" />
        <ClassType ID="Custom.Example.MyDistributedApplication.Customers" Base="System!System.ApplicationComponent" Accessibility="Public" Abstract="false" Hosted="false" Singleton="true" />
        <ClassType ID="Custom.Example.MyDistributedApplication.Applications" Base="System!System.ApplicationComponent" Accessibility="Public" Abstract="false" Hosted="true" Singleton="false" />
        <ClassType ID="Custom.Example.MyDistributedApplication.Infrastructure" Base="System!System.ApplicationComponent" Accessibility="Public" Abstract="false" Hosted="true" Singleton="false" />
        <ClassType ID="Custom.Example.MyDistributedApplication.Application" Base="System!System.ApplicationComponent" Accessibility="Public" Abstract="true" Hosted="true" Singleton="false">
          <Property ID="ApplicationName" Type="string" Key="true" MaxLength="256" MinLength="0" />
          <Property ID="DBConnectionString" Type="string" Key="false" MaxLength="256" MinLength="0" />
        </ClassType>
        <ClassType ID="Custom.Example.MyDistributedApplication.Service" Base="Windows!Microsoft.Windows.ApplicationComponent" Accessibility="Public" Abstract="true" Hosted="false" Singleton="false">
          <Property ID="MachineName" Type="string" Key="false" MaxLength="256" MinLength="0" />
          <Property ID="ServiceName" Type="string" Key="true" MaxLength="256" MinLength="0" />
          <Property ID="Port" Type="int" Key="false" MaxLength="256" MinLength="0" />
        </ClassType>
        <ClassType ID="Custom.Example.MyDistributedApplication.ResourcePool" Accessibility="Public" Abstract="false" Base="SC!Microsoft.SystemCenter.ManagementServicePool" Hosted="false" Singleton="true" Extension="false" />
      </ClassTypes>
      <RelationshipTypes>
        <RelationshipType ID="Custom.Example.MyDistributedApplication.Relationship.AdventureWorksCyclesHostsService" Accessibility="Public" Abstract="false" Base="System!System.Hosting">
          <Source ID="Source" Type="Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles" />
          <Target ID="Target" Type="Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles.Service" />
        </RelationshipType>
        <RelationshipType ID="Custom.Example.MyDistributedApplication.Relationship.AlpineSkiHouseHostsService" Accessibility="Public" Abstract="false" Base="System!System.Hosting">
          <Source ID="Source" Type="Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse" />
          <Target ID="Target" Type="Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse.Service" />
        </RelationshipType>
        <RelationshipType ID="Custom.Example.MyDistributedApplication.Relationship.BlueYonderAirlinesHostsService" Accessibility="Public" Abstract="false" Base="System!System.Hosting">
          <Source ID="Source" Type="Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines" />
          <Target ID="Target" Type="Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines.Service" />
        </RelationshipType>
        <RelationshipType ID="Custom.Example.MyDistributedApplication.Relationship.FabrikamContainsCustomers" Accessibility="Public" Abstract="false" Base="System!System.Containment">
          <Source ID="Source" Type="Custom.Example.MyDistributedApplication.Fabrikam" />
          <Target ID="Target" Type="Custom.Example.MyDistributedApplication.Customers" />
        </RelationshipType>
        <RelationshipType ID="Custom.Example.MyDistributedApplication.Relationship.CustomersContainsCustomer" Accessibility="Public" Abstract="false" Base="System!System.Containment">
          <Source ID="Source" Type="Custom.Example.MyDistributedApplication.Customers" />
          <Target ID="Target" Type="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer" />
        </RelationshipType>
        <RelationshipType ID="Custom.Example.MyDistributedApplication.Relationship.CustomerHostsApplications" Accessibility="Public" Abstract="false" Base="System!System.Hosting">
          <Source ID="Source" Type="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer" />
          <Target ID="Target" Type="Custom.Example.MyDistributedApplication.Applications" />
        </RelationshipType>
        <RelationshipType ID="Custom.Example.MyDistributedApplication.Relationship.CustomerHostsInfrastructure" Accessibility="Public" Abstract="false" Base="System!System.Hosting">
          <Source ID="Source" Type="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer" />
          <Target ID="Target" Type="Custom.Example.MyDistributedApplication.Infrastructure" />
        </RelationshipType>
        <RelationshipType ID="Custom.Example.MyDistributedApplication.Relationship.InfrastructureContainsDatabase" Accessibility="Public" Abstract="false" Base="System!System.Containment">
          <Source ID="Source" Type="Custom.Example.MyDistributedApplication.Infrastructure" />
          <Target ID="Target" Type="SQLLibrary!Microsoft.SQLServer.Database" />
        </RelationshipType>
        <RelationshipType ID="Custom.Example.MyDistributedApplication.Relationship.ApplicationsHostsApplication" Accessibility="Public" Abstract="false" Base="System!System.Hosting">
          <Source ID="Source" Type="Custom.Example.MyDistributedApplication.Applications" />
          <Target ID="Target" Type="Custom.Example.MyDistributedApplication.Application" />
        </RelationshipType>
      </RelationshipTypes>
    </EntityTypes>
    <SecureReferences>
      <SecureReference ID="Custom.Example.MyDistributedApplication.SecureReference.DiscoveryProfile" Accessibility="Public" />
      <SecureReference ID="Custom.Example.MyDistributedApplication.SecureReference.MonitoringProfile" Accessibility="Public" />
    </SecureReferences>
  </TypeDefinitions>
  <LanguagePacks>
    <LanguagePack ID="ENU" IsDefault="true">
      <DisplayStrings>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles">
          <Name>Adventure Works Cycles Application</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles.Service">
          <Name>Adventure Works Cycles Application Service</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse">
          <Name>Alpine Ski House Application</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse.Service">
          <Name>Alpine Ski House Application Service</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines">
          <Name>Blue Yonder Airlines Application</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines.Service">
          <Name>Blue Yonder Airlines Application Service</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Fabrikam">
          <Name>Fabrikam Environment</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Customers">
          <Name>Fabrikam Customers</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Applications">
          <Name>Customer Applications</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Infrastructure">
          <Name>Customer Infrastructure</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Application">
          <Name>Fabrikam Application</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Application" SubElementID="ApplicationName">
          <Name>Application Name</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Application" SubElementID="DBConnectionString">
          <Name>Application DB Connection String</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Service">
          <Name>Application Service</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Service" SubElementID="MachineName">
          <Name>Application Machine Name</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Service" SubElementID="ServiceName">
          <Name>Application Service Name</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Service" SubElementID="Port">
          <Name>Application Service Port</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.ResourcePool">
          <Name>Fabrikam Monitoring Resource Pool</Name>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Library">
          <Name>My Distributed Application Library</Name>
          <Description>My Distributed Application Library Management Pack</Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Relationship.AdventureWorksCyclesHostsService">
          <Name>Adventure Works Cycles Hosts Service Class Relationship</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Relationship.AlpineSkiHouseHostsService">
          <Name>Alpine Ski House Hosts Service Class Relationship</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Relationship.BlueYonderAirlinesHostsService">
          <Name>Blue Yonder Airlines Hosts Service Class Relationship</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Relationship.FabrikamContainsCustomers">
          <Name>Fabrikam Class Contains Customers Class Relationship</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Relationship.CustomersContainsCustomer">
          <Name>Fabrikam Customers Class Contains Customer Class Relationship</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Relationship.CustomerHostsApplications">
          <Name>CMDB Customer Class Hosts Applications Class Relationship</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Relationship.CustomerHostsInfrastructure">
          <Name>CMDB Customer Class Hosts Infrastructure Class Relationship</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.SecureReference.DiscoveryProfile">
          <Name>My Distributed Application Discovery RunAs Profile</Name>
          <Description>Account used to discover customers and applications</Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.SecureReference.MonitoringProfile">
          <Name>My Distributed Application Monitoring RunAs Profile</Name>
          <Description>Account used to monitoring customer databases</Description>
        </DisplayString>
      </DisplayStrings>
      <KnowledgeArticles></KnowledgeArticles>
    </LanguagePack>
  </LanguagePacks>
</ManagementPack>
  • Custom.Example.MyDistributedApplication.Monitoring – Contains the monitoring rules and monitors for the solution
 <?xml version="1.0" encoding="utf-8"?>
<ManagementPack SchemaVersion="2.0" ContentReadable="true" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
  <Manifest>
    <Identity>
      <ID>Custom.Example.MyDistributedApplication.Monitoring</ID>
      <Version>1.0.0.1</Version>
    </Identity>
    <Name>My Distributed Application Monitoring</Name>
    <References>
      <Reference Alias="CMDBLibrary">
        <ID>Custom.Example.MyDistributedApplication.CMDB.Library</ID>
        <Version>1.0.0.0</Version>
        <PublicKeyToken>e24f5efd5fd6e660</PublicKeyToken>
      </Reference>
      <Reference Alias="DALibrary">
        <ID>Custom.Example.MyDistributedApplication.Library</ID>
        <Version>1.0.0.0</Version>
        <PublicKeyToken>e24f5efd5fd6e660</PublicKeyToken>
      </Reference>
      <Reference Alias="SCDW">
        <ID>Microsoft.SystemCenter.DataWarehouse.Library</ID>
        <Version>7.1.10226.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="SC">
        <ID>Microsoft.SystemCenter.Library</ID>
        <Version>7.0.8433.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="Windows">
        <ID>Microsoft.Windows.Library</ID>
        <Version>7.5.8501.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="Health">
        <ID>System.Health.Library</ID>
        <Version>7.0.8433.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="System">
        <ID>System.Library</ID>
        <Version>7.5.8501.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="Performance">
        <ID>System.Performance.Library</ID>
        <Version>7.0.8433.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
    </References>
  </Manifest>
  <TypeDefinitions>
    <ModuleTypes>
      <DataSourceModuleType ID="Custom.Example.MyDistributedApplication.Monitoring.DataSource.ServiceRunning" Accessibility="Public" Batching="false">
        <Configuration>
          <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="MachineName" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="ServiceName" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="Port" type="xsd:integer" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="MachineName" Selector="$Config/ServiceName$" ParameterType="string" />
          <OverrideableParameter ID="ServiceName" Selector="$Config/ServiceName$" ParameterType="string" />
          <OverrideableParameter ID="Port" Selector="$Config/Port$" ParameterType="int" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="DS" TypeID="System!System.SimpleScheduler">
                <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
                <SyncTime />
              </DataSource>
              <ProbeAction ID="Probe" TypeID="Windows!Microsoft.Windows.WmiProbe">
                <NameSpace>\\$Config/MachineName$\root\cimv2</NameSpace>
                <Query>select State from Win32_Service where Name = '$Config/ServiceName$'</Query>
              </ProbeAction>
            </MemberModules>
            <Composition>
              <Node ID="Probe">
                <Node ID="DS" />
              </Node>
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.BaseData</OutputType>
      </DataSourceModuleType>
      <DataSourceModuleType ID="Custom.Example.MyDistributedApplication.Monitoring.DataSource.QueryDB" Accessibility="Public" Batching="false">
        <Configuration>
          <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="ConnectionString" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="Query" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="ConnectionString" Selector="$Config/ConnectionString$" ParameterType="string" />
          <OverrideableParameter ID="Query" Selector="$Config/Query$" ParameterType="string" />
        </OverrideableParameters>
        <ModuleImplementation Isolation="Any">
          <Composite>
            <MemberModules>
              <DataSource ID="DS" TypeID="System!System.Scheduler">
                <Scheduler>
                  <SimpleReccuringSchedule>
                    <Interval>$Config/IntervalSeconds$</Interval>
                  </SimpleReccuringSchedule>
                  <ExcludeDates />
                </Scheduler>
              </DataSource>
              <ProbeAction ID="Probe" TypeID="System!System.OleDbProbe">
                <ConnectionString>$Config/ConnectionString$</ConnectionString>
                <Query>$Config/Query$</Query>
                <GetValue>true</GetValue>
                <OneRowPerItem>true</OneRowPerItem>
              </ProbeAction>
            </MemberModules>
            <Composition>
              <Node ID="Probe">
                <Node ID="DS" />
              </Node>
            </Composition>
          </Composite>
        </ModuleImplementation>
        <OutputType>System!System.OleDbData</OutputType>
      </DataSourceModuleType>
    </ModuleTypes>
    <MonitorTypes>
      <UnitMonitorType ID="Custom.Example.MyDistributedApplication.Monitoring.MonitorType.ServiceRunning" Accessibility="Public">
        <MonitorTypeStates>
          <MonitorTypeState ID="Running" NoDetection="false" />
          <MonitorTypeState ID="NotRunning" NoDetection="false" />
        </MonitorTypeStates>
        <Configuration>
          <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="MachineName" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="ServiceName" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="Port" type="xsd:integer" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int" />
          <OverrideableParameter ID="MachineName" Selector="$Config/ServiceName$" ParameterType="string" />
          <OverrideableParameter ID="ServiceName" Selector="$Config/ServiceName$" ParameterType="string" />
          <OverrideableParameter ID="Port" Selector="$Config/Port$" ParameterType="int" />
        </OverrideableParameters>
        <MonitorImplementation>
          <MemberModules>
            <DataSource ID="DS" TypeID="Custom.Example.MyDistributedApplication.Monitoring.DataSource.ServiceRunning">
              <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
              <MachineName>$Config/MachineName$</MachineName>
              <ServiceName>$Config/ServiceName$</ServiceName>
              <Port>$Config/Port$</Port>
            </DataSource>
            <ConditionDetection ID="CDRunning" TypeID="System!System.ExpressionFilter">
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Property[@Name='State']</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="String">Running</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </ConditionDetection>
            <ConditionDetection ID="CDNotRunning" TypeID="System!System.ExpressionFilter">
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Property[@Name='State']</XPathQuery>
                  </ValueExpression>
                  <Operator>NotEqual</Operator>
                  <ValueExpression>
                    <Value Type="String">Running</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </ConditionDetection>
          </MemberModules>
          <RegularDetections>
            <RegularDetection MonitorTypeStateID="Running">
              <Node ID="CDRunning">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
            <RegularDetection MonitorTypeStateID="NotRunning">
              <Node ID="CDNotRunning">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
          </RegularDetections>
        </MonitorImplementation>
      </UnitMonitorType>
      <UnitMonitorType ID="Custom.Example.MyDistributedApplication.Monitoring.MonitorType.ApplicationHealthTwoState" Accessibility="Public">
        <MonitorTypeStates>
          <MonitorTypeState ID="Healthy" NoDetection="false" />
          <MonitorTypeState ID="UnHealthy" NoDetection="false" />
        </MonitorTypeStates>
        <Configuration>
          <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="ConnectionString" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="Query" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="Value" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
        </Configuration>
        <MonitorImplementation>
          <MemberModules>
            <DataSource ID="DS" TypeID="Custom.Example.MyDistributedApplication.Monitoring.DataSource.QueryDB">
              <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
              <ConnectionString>$Config/ConnectionString$</ConnectionString>
              <Query>$Config/Query$</Query>
            </DataSource>
            <ConditionDetection ID="CDHealthy" TypeID="System!System.ExpressionFilter">
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Columns[1]/Column[1]</XPathQuery>
                  </ValueExpression>
                  <Operator>Equal</Operator>
                  <ValueExpression>
                    <Value Type="String">$Config/Value$</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </ConditionDetection>
            <ConditionDetection ID="CDUnHealthy" TypeID="System!System.ExpressionFilter">
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Columns[1]/Column[1]</XPathQuery>
                  </ValueExpression>
                  <Operator>NotEqual</Operator>
                  <ValueExpression>
                    <Value Type="String">$Config/Value$</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </ConditionDetection>
          </MemberModules>
          <RegularDetections>
            <RegularDetection MonitorTypeStateID="Healthy">
              <Node ID="CDHealthy">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
            <RegularDetection MonitorTypeStateID="UnHealthy">
              <Node ID="CDUnHealthy">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
          </RegularDetections>
        </MonitorImplementation>
      </UnitMonitorType>
      <UnitMonitorType ID="Custom.Example.MyDistributedApplication.Monitoring.MonitorType.ApplicationHealthTimerReset" Accessibility="Public">
        <MonitorTypeStates>
          <MonitorTypeState ID="Healthy" NoDetection="false" />
          <MonitorTypeState ID="UnHealthy" NoDetection="false" />
        </MonitorTypeStates>
        <Configuration>
          <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="ConnectionString" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="Query" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="Value" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="TimerWaitInSeconds" type="xsd:integer" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
        </Configuration>
        <MonitorImplementation>
          <MemberModules>
            <DataSource ID="DS" TypeID="Custom.Example.MyDistributedApplication.Monitoring.DataSource.QueryDB">
              <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
              <ConnectionString>$Config/ConnectionString$</ConnectionString>
              <Query>$Config/Query$</Query>
            </DataSource>
            <ConditionDetection ID="CDHealthy" TypeID="System!System.TimerCondition">
              <TimerWaitInSeconds>$Config/TimerWaitInSeconds$</TimerWaitInSeconds>
            </ConditionDetection>
            <ConditionDetection ID="CDUnHealthy" TypeID="System!System.ExpressionFilter">
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Columns[1]/Column[1]</XPathQuery>
                  </ValueExpression>
                  <Operator>NotEqual</Operator>
                  <ValueExpression>
                    <Value Type="String">$Config/Value$</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </ConditionDetection>
          </MemberModules>
          <RegularDetections>
            <RegularDetection MonitorTypeStateID="Healthy">
              <Node ID="CDHealthy">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
            <RegularDetection MonitorTypeStateID="UnHealthy">
              <Node ID="CDUnHealthy">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
          </RegularDetections>
        </MonitorImplementation>
      </UnitMonitorType>
      <UnitMonitorType ID="Custom.Example.MyDistributedApplication.Monitoring.MonitorType.PerformanceHealthTwoState" Accessibility="Public">
        <MonitorTypeStates>
          <MonitorTypeState ID="Healthy" NoDetection="false" />
          <MonitorTypeState ID="UnHealthy" NoDetection="false" />
        </MonitorTypeStates>
        <Configuration>
          <xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="ConnectionString" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="Query" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
          <xsd:element minOccurs="1" name="Value" type="xsd:string" xmlns:xsd="https://www.w3.org/2001/XMLSchema" />
        </Configuration>
        <MonitorImplementation>
          <MemberModules>
            <DataSource ID="DS" TypeID="Custom.Example.MyDistributedApplication.Monitoring.DataSource.QueryDB">
              <IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
              <ConnectionString>$Config/ConnectionString$</ConnectionString>
              <Query>$Config/Query$</Query>
            </DataSource>
            <ConditionDetection ID="CDHealthy" TypeID="System!System.ExpressionFilter">
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Columns[1]/Column[1]</XPathQuery>
                  </ValueExpression>
                  <Operator>LessEqual</Operator>
                  <ValueExpression>
                    <Value Type="String">$Config/Value$</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </ConditionDetection>
            <ConditionDetection ID="CDUnHealthy" TypeID="System!System.ExpressionFilter">
              <Expression>
                <SimpleExpression>
                  <ValueExpression>
                    <XPathQuery Type="String">Columns[1]/Column[1]</XPathQuery>
                  </ValueExpression>
                  <Operator>Greater</Operator>
                  <ValueExpression>
                    <Value Type="String">$Config/Value$</Value>
                  </ValueExpression>
                </SimpleExpression>
              </Expression>
            </ConditionDetection>
          </MemberModules>
          <RegularDetections>
            <RegularDetection MonitorTypeStateID="Healthy">
              <Node ID="CDHealthy">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
            <RegularDetection MonitorTypeStateID="UnHealthy">
              <Node ID="CDUnHealthy">
                <Node ID="DS" />
              </Node>
            </RegularDetection>
          </RegularDetections>
        </MonitorImplementation>
      </UnitMonitorType>
    </MonitorTypes>
  </TypeDefinitions>
  <Monitoring>
    <Rules>
      <Rule ID="Custom.Example.MyDistributedApplication.Monitoring.Rule.BlueYonderAirlinesError" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines" ConfirmDelivery="true" Remotable="true" Priority="Normal" DiscardLevel="100">
        <Category>Alert</Category>
        <DataSources>
          <DataSource ID="DS" TypeID="Custom.Example.MyDistributedApplication.Monitoring.DataSource.QueryDB">
            <IntervalSeconds>300</IntervalSeconds>
            <ConnectionString>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/DBConnectionString$</ConnectionString>
            <Query><![CDATA[select Type, Message, TimeStamp from HealthData hd
join Applications app on app.ApplicationID = hd.ApplicationID
where app.ApplicationName = '$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/ApplicationName$'
and hd.Type = 2
and datediff(minute, hd.TimeStamp, GetDate()) < 5
order by TimeStamp desc]]></Query>
          </DataSource>
        </DataSources>
        <ConditionDetection ID="CD" TypeID="System!System.ExpressionFilter">
          <Expression>
            <SimpleExpression>
              <ValueExpression>
                <XPathQuery Type="String">Columns[1]/Column[1]</XPathQuery>
              </ValueExpression>
              <Operator>NotEqual</Operator>
              <ValueExpression>
                <Value Type="String">1</Value>
              </ValueExpression>
            </SimpleExpression>
          </Expression>
        </ConditionDetection>
        <WriteActions>
          <WriteAction ID="WA" TypeID="Health!System.Health.GenerateAlert">
            <Priority>1</Priority>
            <Severity>2</Severity>
            <AlertMessageId>$MPElement[Name="Custom.Example.MyDistributedApplication.Monitoring.Rule.BlueYonderAirlinesError_AlertMessageResourceID"]$</AlertMessageId>
            <AlertParameters>
              <AlertParameter1>$Target/Host/Host/Property[Type="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer"]/CustomerName$</AlertParameter1>
              <AlertParameter2>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/ApplicationName$</AlertParameter2>
              <AlertParameter3>$Data/Columns[1]/Column[2]$</AlertParameter3>
              <AlertParameter4>$Data/Columns[1]/Column[1]$</AlertParameter4>
            </AlertParameters>
          </WriteAction>
        </WriteActions>
      </Rule>
      <Rule ID="Custom.Example.MyDistributedApplication.Monitoring.Rule.CollectAdventureWorksCyclesOrderBacklog" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles" ConfirmDelivery="true" Remotable="true" Priority="Normal" DiscardLevel="100">
        <Category>PerformanceCollection</Category>
        <DataSources>
          <DataSource ID="DS" TypeID="Custom.Example.MyDistributedApplication.Monitoring.DataSource.QueryDB">
            <IntervalSeconds>300</IntervalSeconds>
            <ConnectionString>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/DBConnectionString$</ConnectionString>
            <Query><![CDATA[select Value, Object, Counter, Instance from PerformanceData pd
join Applications app on app.ApplicationID = pd.ApplicationID
where app.ApplicationName = '$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/ApplicationName$'
and pd.Object = 'POS'
and pd.Counter = 'Orders'
and pd.Instance = '$Target/Host/Host/Property[Type="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer"]/CustomerName$'
order by TimeStamp desc]]></Query>
          </DataSource>
        </DataSources>
        <ConditionDetection ID="Mapper" TypeID="Performance!System.Performance.DataGenericMapper">
          <ObjectName>$Data/Columns[1]/Column[2]$</ObjectName>
          <CounterName>$Data/Columns[1]/Column[3]$</CounterName>
          <InstanceName>$Data/Columns[1]/Column[4]$</InstanceName>
          <Value>$Data/Columns[1]/Column[1]$</Value>
        </ConditionDetection>
        <WriteActions>
          <WriteAction ID="WriteToDB" TypeID="SC!Microsoft.SystemCenter.CollectPerformanceData" />
          <WriteAction ID="WriteToDW" TypeID="SCDW!Microsoft.SystemCenter.DataWarehouse.PublishPerformanceData" />
        </WriteActions>
      </Rule>
    </Rules>
    <Monitors>
      <UnitMonitor ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesHealth" Accessibility="Public" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RunAs="DALibrary!Custom.Example.MyDistributedApplication.SecureReference.MonitoringProfile" TypeID="Custom.Example.MyDistributedApplication.Monitoring.MonitorType.ApplicationHealthTwoState" ConfirmDelivery="true">
        <Category>AvailabilityHealth</Category>
        <AlertSettings AlertMessage="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesHealth_AlertMessageResourceID">
          <AlertOnState>Error</AlertOnState>
          <AutoResolve>true</AutoResolve>
          <AlertPriority>Normal</AlertPriority>
          <AlertSeverity>Error</AlertSeverity>
          <AlertParameters>
            <AlertParameter1>$Target/Host/Host/Property[Type="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer"]/CustomerName$</AlertParameter1>
            <AlertParameter2>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/ApplicationName$</AlertParameter2>
            <AlertParameter3>$Data/Context/Columns[1]/Column[2]$</AlertParameter3>
            <AlertParameter4>$Data/Context/Columns[1]/Column[1]$</AlertParameter4>
          </AlertParameters>
        </AlertSettings>
        <OperationalStates>
          <OperationalState ID="Healthy" MonitorTypeStateID="Healthy" HealthState="Success" />
          <OperationalState ID="UnHealthy" MonitorTypeStateID="UnHealthy" HealthState="Error" />
        </OperationalStates>
        <Configuration>
          <IntervalSeconds>300</IntervalSeconds>
          <ConnectionString>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/DBConnectionString$</ConnectionString>
          <Query><![CDATA[--Get last health event
select top 1 Type, Message from HealthData hd
join Applications app on app.ApplicationID = hd.ApplicationID
where app.ApplicationName = '$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/ApplicationName$'
order by TimeStamp desc]]></Query>
          <Value>1</Value>
        </Configuration>
      </UnitMonitor>
      <UnitMonitor ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AlpineSkiHouseHealth" Accessibility="Public" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RunAs="DALibrary!Custom.Example.MyDistributedApplication.SecureReference.MonitoringProfile" TypeID="Custom.Example.MyDistributedApplication.Monitoring.MonitorType.ApplicationHealthTimerReset" ConfirmDelivery="true">
        <Category>AvailabilityHealth</Category>
        <AlertSettings AlertMessage="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AlpineSkiHouseHealth_AlertMessageResourceID">
          <AlertOnState>Error</AlertOnState>
          <AutoResolve>false</AutoResolve>
          <AlertPriority>Normal</AlertPriority>
          <AlertSeverity>Error</AlertSeverity>
          <AlertParameters>
            <AlertParameter1>$Target/Host/Host/Property[Type="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer"]/CustomerName$</AlertParameter1>
            <AlertParameter2>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/ApplicationName$</AlertParameter2>
            <AlertParameter3>$Data/Context/Columns[1]/Column[2]$</AlertParameter3>
            <AlertParameter4>$Data/Context/Columns[1]/Column[1]$</AlertParameter4>
          </AlertParameters>
        </AlertSettings>
        <OperationalStates>
          <OperationalState ID="Healthy" MonitorTypeStateID="Healthy" HealthState="Success" />
          <OperationalState ID="UnHealthy" MonitorTypeStateID="UnHealthy" HealthState="Error" />
        </OperationalStates>
        <Configuration>
          <IntervalSeconds>300</IntervalSeconds>
          <ConnectionString>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/DBConnectionString$</ConnectionString>
          <Query><![CDATA[--Get last unhealthy health event within last 5 minutes
select top 1 Type, Message, TimeStamp from HealthData hd
join Applications app on app.ApplicationID = hd.ApplicationID
where app.ApplicationName = '$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/ApplicationName$'
and hd.Type = 2
and datediff(minute, hd.TimeStamp, GetDate()) < 5
order by TimeStamp desc]]></Query>
          <Value>1</Value>
          <TimerWaitInSeconds>300</TimerWaitInSeconds>
        </Configuration>
      </UnitMonitor>
      <UnitMonitor ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesOrderBacklog" Accessibility="Public" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles" ParentMonitorID="Health!System.Health.PerformanceState" Remotable="true" Priority="Normal" RunAs="DALibrary!Custom.Example.MyDistributedApplication.SecureReference.MonitoringProfile" TypeID="Custom.Example.MyDistributedApplication.Monitoring.MonitorType.PerformanceHealthTwoState" ConfirmDelivery="true">
        <Category>PerformanceHealth</Category>
        <AlertSettings AlertMessage="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesOrderBacklog_AlertMessageResourceID">
          <AlertOnState>Error</AlertOnState>
          <AutoResolve>true</AutoResolve>
          <AlertPriority>Normal</AlertPriority>
          <AlertSeverity>Error</AlertSeverity>
          <AlertParameters>
            <AlertParameter1>$Target/Host/Host/Property[Type="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer"]/CustomerName$</AlertParameter1>
            <AlertParameter2>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/ApplicationName$</AlertParameter2>
            <AlertParameter3>$Data/Context/Columns[1]/Column[2]$</AlertParameter3>
            <AlertParameter4>$Data/Context/Columns[1]/Column[3]$</AlertParameter4>
            <AlertParameter5>$Data/Context/Columns[1]/Column[4]$</AlertParameter5>
            <AlertParameter6>$Data/Context/Columns[1]/Column[1]$</AlertParameter6>
          </AlertParameters>
        </AlertSettings>
        <OperationalStates>
          <OperationalState ID="Healthy" MonitorTypeStateID="Healthy" HealthState="Success" />
          <OperationalState ID="UnHealthy" MonitorTypeStateID="UnHealthy" HealthState="Error" />
        </OperationalStates>
        <Configuration>
          <IntervalSeconds>300</IntervalSeconds>
          <ConnectionString>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/DBConnectionString$</ConnectionString>
          <Query><![CDATA[select Value, Object, Counter, Instance from PerformanceData pd
join Applications app on app.ApplicationID = pd.ApplicationID
where app.ApplicationName = '$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Application"]/ApplicationName$'
and pd.Object = 'POS'
and pd.Counter = 'Orders'
and pd.Instance = '$Target/Host/Host/Property[Type="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer"]/CustomerName$'
order by TimeStamp desc]]></Query>
          <Value>10</Value>
        </Configuration>
      </UnitMonitor>
      <UnitMonitor ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.ServiceRunning" Accessibility="Public" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Service" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RunAs="DALibrary!Custom.Example.MyDistributedApplication.SecureReference.MonitoringProfile" TypeID="Custom.Example.MyDistributedApplication.Monitoring.MonitorType.ServiceRunning" ConfirmDelivery="true">
        <Category>AvailabilityHealth</Category>
        <AlertSettings AlertMessage="Custom.Example.MyDistributedApplication.Monitoring.Monitor.ServiceRunning_AlertMessageResourceID">
          <AlertOnState>Error</AlertOnState>
          <AutoResolve>true</AutoResolve>
          <AlertPriority>Normal</AlertPriority>
          <AlertSeverity>Error</AlertSeverity>
          <AlertParameters>
            <AlertParameter1>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Service"]/MachineName$</AlertParameter1>
            <AlertParameter2>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Service"]/ServiceName$</AlertParameter2>
            <AlertParameter3>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Service"]/Port$</AlertParameter3>
            <AlertParameter4>$Data/Context/Property[@Name='State']$</AlertParameter4>
          </AlertParameters>
        </AlertSettings>
        <OperationalStates>
          <OperationalState ID="Running" MonitorTypeStateID="Running" HealthState="Success" />
          <OperationalState ID="NotRunning" MonitorTypeStateID="NotRunning" HealthState="Error" />
        </OperationalStates>
        <Configuration>
          <IntervalSeconds>900</IntervalSeconds>
          <MachineName>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Service"]/MachineName$</MachineName>
          <ServiceName>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Service"]/ServiceName$</ServiceName>
          <Port>$Target/Property[Type="DALibrary!Custom.Example.MyDistributedApplication.Service"]/Port$</Port>
        </Configuration>
      </UnitMonitor>
      <DependencyMonitor ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesService" Accessibility="Public" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="DALibrary!Custom.Example.MyDistributedApplication.Relationship.AdventureWorksCyclesHostsService" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AlpineSkiHouseService" Accessibility="Public" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="DALibrary!Custom.Example.MyDistributedApplication.Relationship.AlpineSkiHouseHostsService" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.BlueYonderAirlinesService" Accessibility="Public" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="DALibrary!Custom.Example.MyDistributedApplication.Relationship.BlueYonderAirlinesHostsService" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.FabrikamCustomers" Accessibility="Public" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Fabrikam" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="DALibrary!Custom.Example.MyDistributedApplication.Relationship.FabrikamContainsCustomers" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.CustomersCustomer" Accessibility="Public" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Customers" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="DALibrary!Custom.Example.MyDistributedApplication.Relationship.CustomersContainsCustomer" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.CustomerApplications" Accessibility="Public" Enabled="true" Target="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="DALibrary!Custom.Example.MyDistributedApplication.Relationship.CustomerHostsApplications" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.ApplicationsApplication" Accessibility="Public" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Applications" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="DALibrary!Custom.Example.MyDistributedApplication.Relationship.ApplicationsHostsApplication" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.CustomerInfrastructure" Accessibility="Public" Enabled="true" Target="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="DALibrary!Custom.Example.MyDistributedApplication.Relationship.CustomerHostsInfrastructure" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
      <DependencyMonitor ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.InfrastructureDatabase" Accessibility="Public" Enabled="true" Target="DALibrary!Custom.Example.MyDistributedApplication.Infrastructure" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="DALibrary!Custom.Example.MyDistributedApplication.Relationship.InfrastructureContainsDatabase" MemberMonitor="Health!System.Health.AvailabilityState">
        <Category>Custom</Category>
        <Algorithm>WorstOf</Algorithm>
        <MemberUnAvailable>Error</MemberUnAvailable>
      </DependencyMonitor>
    </Monitors>
  </Monitoring>
  <Presentation>
    <StringResources>
      <StringResource ID="Custom.Example.MyDistributedApplication.Monitoring.Rule.BlueYonderAirlinesError_AlertMessageResourceID" />
      <StringResource ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesHealth_AlertMessageResourceID" />
      <StringResource ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AlpineSkiHouseHealth_AlertMessageResourceID" />
      <StringResource ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesOrderBacklog_AlertMessageResourceID" />
      <StringResource ID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.ServiceRunning_AlertMessageResourceID" />
    </StringResources>
  </Presentation>
  <LanguagePacks>
    <LanguagePack ID="ENU" IsDefault="true">
      <DisplayStrings>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesService">
          <Name>Adventure Works Cycles Depends on Service Availability Monitor</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AlpineSkiHouseService">
          <Name>Alpine Ski House Depends on Service Availability Monitor</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.BlueYonderAirlinesService">
          <Name>Blue Yonder Airlines Depends on Service Availability Monitor</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.FabrikamCustomers">
          <Name>Fabrikam Depends on Customers Availability Monitor</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.CustomersCustomer">
          <Name>Customers Depends on Customer Availability Monitor</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.CustomerApplications">
          <Name>Customer Depends on Applications Availability Monitor</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.ApplicationsApplication">
          <Name>Applications Depends on Application Availability Monitor</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.CustomerInfrastructure">
          <Name>Customer Depends on Infrastructure Monitor</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.InfrastructureDatabase">
          <Name>Infrastructure Depends on Database Availability Monitor</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring">
          <Name>My Distributed Application Monitoring</Name>
          <Description>My Distributed Application Monitoring Management Pack</Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.DataSource.ServiceRunning">
          <Name>My Distributed Application Service Monitoring Data Source</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.DataSource.QueryDB">
          <Name>My Distributed Application Database Query Monitoring Data Source</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.MonitorType.ServiceRunning">
          <Name>My Distributed Application Service Monitoring Monitor Type</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.MonitorType.ApplicationHealthTwoState">
          <Name>My Distributed Application Application Health Two State Monitoring Monitor Type</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.MonitorType.ApplicationHealthTimerReset">
          <Name>My Distributed Application Application Health Timer Reset Monitoring Monitor Type</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.MonitorType.PerformanceHealthTwoState">
          <Name>My Distributed Application Performance Health Two State Monitoring Monitor Type</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Rule.BlueYonderAirlinesError">
          <Name>Blue Yonder Airlines Alerting Rule</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Rule.BlueYonderAirlinesError_AlertMessageResourceID">
          <Name>Blue Yonder Airlines Encountered an Error</Name>
          <Description>
            Customer Name: {0}
            Application Name: {1}
            Message: {2}
            Value: {3}
          </Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Rule.CollectAdventureWorksCyclesOrderBacklog">
          <Name>Adventure Works Cycles Order Backlog Performance Collection Rule</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesHealth">
          <Name>Adventure Works Cycles Two-State Monitor</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesHealth" SubElementID="Healthy">
          <Name>Healthy</Name>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesHealth" SubElementID="UnHealthy">
          <Name>UnHealthy</Name>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesHealth_AlertMessageResourceID">
          <Name>Adventure Works Cycles is UnHealthy</Name>
          <Description>
            Customer Name: {0}
            Application Name: {1}
            Message: {2}
            Value: {3}
          </Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AlpineSkiHouseHealth">
          <Name>Alpine Ski House Timer Reset Monitor</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AlpineSkiHouseHealth" SubElementID="Healthy">
          <Name>Healthy</Name>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AlpineSkiHouseHealth" SubElementID="UnHealthy">
          <Name>UnHealthy</Name>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AlpineSkiHouseHealth_AlertMessageResourceID">
          <Name>Alpine Ski House is UnHealthy</Name>
          <Description>
            Customer Name: {0}
            Application Name: {1}
            Message: {2}
            Value: {3}
          </Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesOrderBacklog">
          <Name>Adventure Works Cycles Two-State Order Backlog Monitor</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesOrderBacklog" SubElementID="Healthy">
          <Name>Healthy</Name>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesOrderBacklog" SubElementID="UnHealthy">
          <Name>UnHealthy</Name>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.AdventureWorksCyclesOrderBacklog_AlertMessageResourceID">
          <Name>Adventure Works Cycles has a high order backlog</Name>
          <Description>
            Customer Name: {0}
            Application Name: {1}
            Object: {2}
            Counter: {3}
            Instance: {4}
            Orders Backlogged: {5}
          </Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.ServiceRunning">
          <Name>My Distributed Application Service Monitoring Monitor</Name>
          <Description></Description>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.ServiceRunning" SubElementID="Running">
          <Name>Running</Name>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.ServiceRunning" SubElementID="NotRunning">
          <Name>NotRunning</Name>
        </DisplayString>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Monitoring.Monitor.ServiceRunning_AlertMessageResourceID">
          <Name>My Distributed Application Service Not Running</Name>
          <Description>
            Machine Name: {0}
            Service Name: {1}
            Port: {2}
            State: {3}
          </Description>
        </DisplayString>
      </DisplayStrings>
      <KnowledgeArticles></KnowledgeArticles>
    </LanguagePack>
  </LanguagePacks>
</ManagementPack>
  • Custom.Example.MyDistributedApplication.Resources – Contains the icons used in the distributed application
 <?xml version="1.0" encoding="utf-8"?>
<ManagementPack SchemaVersion="2.0" ContentReadable="true" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
  <Manifest>
    <Identity>
      <ID>Custom.Example.MyDistributedApplication.Resources</ID>
      <Version>1.0.0.1</Version>
    </Identity>
    <Name>My Distributed Application Resources</Name>
    <References>
      <Reference Alias="CMDBLibrary">
        <ID>Custom.Example.MyDistributedApplication.CMDB.Library</ID>
        <Version>1.0.0.0</Version>
        <PublicKeyToken>e24f5efd5fd6e660</PublicKeyToken>
      </Reference>
      <Reference Alias="DALibrary">
        <ID>Custom.Example.MyDistributedApplication.Library</ID>
        <Version>1.0.0.0</Version>
        <PublicKeyToken>e24f5efd5fd6e660</PublicKeyToken>
      </Reference>
      <Reference Alias="System">
        <ID>System.Library</ID>
        <Version>7.5.8501.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
    </References>
  </Manifest>
  <Categories>
    <Category ID="Custom.Example.MyDistributedApplication.Category.16x16Image.AdventureWorksCycles" Target="Custom.Example.MyDistributedApplication.Resource.16x16Image.AdventureWorksCycles" Value="System!System.Internal.ManagementPack.Images.u16x16Icon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.80x80Image.AdventureWorksCycles" Target="Custom.Example.MyDistributedApplication.Resource.80x80Image.AdventureWorksCycles" Value="System!System.Internal.ManagementPack.Images.DiagramIcon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.16x16Image.AlpineSkiHouse" Target="Custom.Example.MyDistributedApplication.Resource.16x16Image.AlpineSkiHouse" Value="System!System.Internal.ManagementPack.Images.u16x16Icon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.80x80Image.AlpineSkiHouse" Target="Custom.Example.MyDistributedApplication.Resource.80x80Image.AlpineSkiHouse" Value="System!System.Internal.ManagementPack.Images.DiagramIcon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.16x16Image.BlueYonderAirlines" Target="Custom.Example.MyDistributedApplication.Resource.16x16Image.BlueYonderAirlines" Value="System!System.Internal.ManagementPack.Images.u16x16Icon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.80x80Image.BlueYonderAirlines" Target="Custom.Example.MyDistributedApplication.Resource.80x80Image.BlueYonderAirlines" Value="System!System.Internal.ManagementPack.Images.DiagramIcon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.16x16Image.AdventureWorksCycles.Service" Target="Custom.Example.MyDistributedApplication.Resource.16x16Image.AdventureWorksCycles.Service" Value="System!System.Internal.ManagementPack.Images.u16x16Icon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.80x80Image.AdventureWorksCycles.Service" Target="Custom.Example.MyDistributedApplication.Resource.80x80Image.AdventureWorksCycles.Service" Value="System!System.Internal.ManagementPack.Images.DiagramIcon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.16x16Image.AlpineSkiHouse.Service" Target="Custom.Example.MyDistributedApplication.Resource.16x16Image.AlpineSkiHouse.Service" Value="System!System.Internal.ManagementPack.Images.u16x16Icon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.80x80Image.AlpineSkiHouse.Service" Target="Custom.Example.MyDistributedApplication.Resource.80x80Image.AlpineSkiHouse.Service" Value="System!System.Internal.ManagementPack.Images.DiagramIcon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.16x16Image.BlueYonderAirlines.Service" Target="Custom.Example.MyDistributedApplication.Resource.16x16Image.BlueYonderAirlines.Service" Value="System!System.Internal.ManagementPack.Images.u16x16Icon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.80x80Image.BlueYonderAirlines.Service" Target="Custom.Example.MyDistributedApplication.Resource.80x80Image.BlueYonderAirlines.Service" Value="System!System.Internal.ManagementPack.Images.DiagramIcon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.16x16Image.Fabrikam" Target="Custom.Example.MyDistributedApplication.Resource.16x16Image.Fabrikam" Value="System!System.Internal.ManagementPack.Images.u16x16Icon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.80x80Image.Fabrikam" Target="Custom.Example.MyDistributedApplication.Resource.80x80Image.Fabrikam" Value="System!System.Internal.ManagementPack.Images.DiagramIcon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.16x16Image.Customers" Target="Custom.Example.MyDistributedApplication.Resource.16x16Image.Customers" Value="System!System.Internal.ManagementPack.Images.u16x16Icon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.80x80Image.Customers" Target="Custom.Example.MyDistributedApplication.Resource.80x80Image.Customers" Value="System!System.Internal.ManagementPack.Images.DiagramIcon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.16x16Image.Customer" Target="Custom.Example.MyDistributedApplication.Resource.16x16Image.Customer" Value="System!System.Internal.ManagementPack.Images.u16x16Icon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.80x80Image.Customer" Target="Custom.Example.MyDistributedApplication.Resource.80x80Image.Customer" Value="System!System.Internal.ManagementPack.Images.DiagramIcon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.16x16Image.Applications" Target="Custom.Example.MyDistributedApplication.Resource.16x16Image.Applications" Value="System!System.Internal.ManagementPack.Images.u16x16Icon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.80x80Image.Applications" Target="Custom.Example.MyDistributedApplication.Resource.80x80Image.Applications" Value="System!System.Internal.ManagementPack.Images.DiagramIcon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.16x16Image.Infrastructure" Target="Custom.Example.MyDistributedApplication.Resource.16x16Image.Infrastructure" Value="System!System.Internal.ManagementPack.Images.u16x16Icon" />
    <Category ID="Custom.Example.MyDistributedApplication.Category.80x80Image.Infrastructure" Target="Custom.Example.MyDistributedApplication.Resource.80x80Image.Infrastructure" Value="System!System.Internal.ManagementPack.Images.DiagramIcon" />
  </Categories>
  <Presentation>
    <ImageReferences>
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles" ImageID="Custom.Example.MyDistributedApplication.Resource.16x16Image.AdventureWorksCycles" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles" ImageID="Custom.Example.MyDistributedApplication.Resource.80x80Image.AdventureWorksCycles" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse" ImageID="Custom.Example.MyDistributedApplication.Resource.16x16Image.AlpineSkiHouse" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse" ImageID="Custom.Example.MyDistributedApplication.Resource.80x80Image.AlpineSkiHouse" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines" ImageID="Custom.Example.MyDistributedApplication.Resource.16x16Image.BlueYonderAirlines" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines" ImageID="Custom.Example.MyDistributedApplication.Resource.80x80Image.BlueYonderAirlines" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles.Service" ImageID="Custom.Example.MyDistributedApplication.Resource.16x16Image.AdventureWorksCycles.Service" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Application.AdventureWorksCycles.Service" ImageID="Custom.Example.MyDistributedApplication.Resource.80x80Image.AdventureWorksCycles.Service" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse.Service" ImageID="Custom.Example.MyDistributedApplication.Resource.16x16Image.AlpineSkiHouse.Service" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Application.AlpineSkiHouse.Service" ImageID="Custom.Example.MyDistributedApplication.Resource.80x80Image.AlpineSkiHouse.Service" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines.Service" ImageID="Custom.Example.MyDistributedApplication.Resource.16x16Image.BlueYonderAirlines.Service" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Application.BlueYonderAirlines.Service" ImageID="Custom.Example.MyDistributedApplication.Resource.80x80Image.BlueYonderAirlines.Service" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Fabrikam" ImageID="Custom.Example.MyDistributedApplication.Resource.16x16Image.Fabrikam" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Fabrikam" ImageID="Custom.Example.MyDistributedApplication.Resource.80x80Image.Fabrikam" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Customers" ImageID="Custom.Example.MyDistributedApplication.Resource.16x16Image.Customers" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Customers" ImageID="Custom.Example.MyDistributedApplication.Resource.80x80Image.Customers" />
      <ImageReference ElementID="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer" ImageID="Custom.Example.MyDistributedApplication.Resource.16x16Image.Customer" />
      <ImageReference ElementID="CMDBLibrary!Custom.Example.MyDistributedApplication.CMDB.Customer" ImageID="Custom.Example.MyDistributedApplication.Resource.80x80Image.Customer" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Applications" ImageID="Custom.Example.MyDistributedApplication.Resource.16x16Image.Applications" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Applications" ImageID="Custom.Example.MyDistributedApplication.Resource.80x80Image.Applications" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Infrastructure" ImageID="Custom.Example.MyDistributedApplication.Resource.16x16Image.Infrastructure" />
      <ImageReference ElementID="DALibrary!Custom.Example.MyDistributedApplication.Infrastructure" ImageID="Custom.Example.MyDistributedApplication.Resource.80x80Image.Infrastructure" />
    </ImageReferences>
  </Presentation>
  <LanguagePacks>
    <LanguagePack ID="ENU" IsDefault="true">
      <DisplayStrings>
        <DisplayString ElementID="Custom.Example.MyDistributedApplication.Resources">
          <Name>My Distributed Application Resources</Name>
          <Description>My Distributed Application Resources Management Pack</Description>
        </DisplayString>
      </DisplayStrings>
      <KnowledgeArticles></KnowledgeArticles>
    </LanguagePack>
  </LanguagePacks>
  <Resources>
    <Image ID="Custom.Example.MyDistributedApplication.Resource.16x16Image.AdventureWorksCycles" Accessibility="Public" FileName="AdventureWorksCycles16x16.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.80x80Image.AdventureWorksCycles" Accessibility="Public" FileName="AdventureWorksCycles80x80.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.16x16Image.AlpineSkiHouse" Accessibility="Public" FileName="AlpineSkiHouse16x16.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.80x80Image.AlpineSkiHouse" Accessibility="Public" FileName="AlpineSkiHouse80x80.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.16x16Image.BlueYonderAirlines" Accessibility="Public" FileName="BlueYonderAirlines16x16.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.80x80Image.BlueYonderAirlines" Accessibility="Public" FileName="BlueYonderAirlines80x80.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.16x16Image.AdventureWorksCycles.Service" Accessibility="Public" FileName="Service16x16.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.80x80Image.AdventureWorksCycles.Service" Accessibility="Public" FileName="Service80x80.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.16x16Image.AlpineSkiHouse.Service" Accessibility="Public" FileName="Service16x16.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.80x80Image.AlpineSkiHouse.Service" Accessibility="Public" FileName="Service80x80.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.16x16Image.BlueYonderAirlines.Service" Accessibility="Public" FileName="Service16x16.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.80x80Image.BlueYonderAirlines.Service" Accessibility="Public" FileName="Service80x80.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.16x16Image.Fabrikam" Accessibility="Public" FileName="Fabrikam16x16.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.80x80Image.Fabrikam" Accessibility="Public" FileName="Fabrikam80x80.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.16x16Image.Customers" Accessibility="Public" FileName="Customers16x16.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.80x80Image.Customers" Accessibility="Public" FileName="Customers80x80.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.16x16Image.Customer" Accessibility="Public" FileName="Customer16x16.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.80x80Image.Customer" Accessibility="Public" FileName="Customer80x80.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.16x16Image.Applications" Accessibility="Public" FileName="Applications16x16.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.80x80Image.Applications" Accessibility="Public" FileName="Applications80x80.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.16x16Image.Infrastructure" Accessibility="Public" FileName="Infrastructure16x16.png" HasNullStream="false" />
    <Image ID="Custom.Example.MyDistributedApplication.Resource.80x80Image.Infrastructure" Accessibility="Public" FileName="Infrastructure80x80.png" HasNullStream="false" />
  </Resources>
</ManagementPack>

DistributedApplicationMonitoring.zip