bnt21046 0 Report post Posted February 15, 2017 Does anyone have any experienced with monitoring a Cisco ACI environment? Any good documentation that I can reference? Thanks, Quote Share this post Link to post Share on other sites
1 Tom Lasswell 21 Report post Posted July 18, 2018 @Brent Reeves ACI monitoring is a quite complicated area. We've developed some custom things around the way we want to monitor and document things, but I do have a few basic monitoring ones that I can share. It may take a while to go through security validation though on the LM side. Ultimately, building the datasources isn't highly complicated for getting the data out of the ACI console. My engineers are mostly versed in PowerShell so this example is how to login and pull data via REST from the APIC for data, but to find the calls you'd want to make you'd use dev tools in Chrome and watch the REST calls that it makes as you browse the pages for the data you'd want. Example: Get all interface statistics: Active Discovery: # This is where we save the cookies! $global:CookieJar = New-Object System.Net.CookieContainer $global:LoggedIn = $False $global:LoggingIn = $False function ACI-API-Call([string]$method, [string]$encoding, [string]$url, $headers, [string]$postData) { $return_value = New-Object PsObject -Property @{httpCode = ""; httpResponse = ""} ## Create the request [System.Net.HttpWebRequest] $request = [System.Net.HttpWebRequest] [System.Net.WebRequest]::Create($url) # Ignore SSL certificate errors [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} [System.Net.ServicePointManager]::SecurityProtocol = 3072 # <-- ACI NEEDS THIS!! # We want cookies! $request.CookieContainer = $global:CookieJar ## Add the method (GET, POST, etc.) $request.Method = $method ## Add an headers to the request foreach($key in $headers.keys) { $request.Headers.Add($key, $headers[$key]) } # If we're logged in, add the saved cookies to this request if ($global:LoggedIn -eq $True) { $request.CookieContainer = $global:CookieJar $global:LoggingIn = $False } else { # We're not logged in to the APIC, start login first if($global:LoggingIn -eq $False) { $global:LoggingIn = $True ACI-Login $apic $username $password } } ## We are using $encoding for the request as well as the expected response $request.Accept = $encoding ## Send a custom user agent if you want $request.UserAgent = "PowerShell script" ## Create the request body if the verb accepts it (NOTE: utf-8 is assumed here) if ($method -eq "POST" -or $method -eq "PUT") { $bytes = [System.Text.Encoding]::UTF8.GetBytes($postData) $request.ContentType = $encoding $request.ContentLength = $bytes.Length [System.IO.Stream] $outputStream = [System.IO.Stream]$request.GetRequestStream() $outputStream.Write($bytes,0,$bytes.Length) $outputStream.Close() } ## This is where we actually make the call. try { [System.Net.HttpWebResponse] $response = [System.Net.HttpWebResponse] $request.GetResponse() foreach($cookie in $response.Cookies) { # We've found the APIC cookie and can conclude our login business if($cookie.Name -eq "APIC-cookie") { $global:LoggedIn = $True $global:LoggingIn = $False } } $sr = New-Object System.IO.StreamReader($response.GetResponseStream()) $txt = $sr.ReadToEnd() ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host "CONTENT-TYPE: " $response.ContentType ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host "RAW RESPONSE DATA:" . $txt ## Return the response body to the caller $return_value.httpResponse = $txt $return_value.httpCode = [int]$response.StatusCode return $return_value } ## This catches errors from the server (404, 500, 501, etc.) catch [Net.WebException] { [System.Net.HttpWebResponse] $resp = [System.Net.HttpWebResponse] $_.Exception.Response ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host $resp.StatusCode -ForegroundColor Red -BackgroundColor Yellow ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host $resp.StatusDescription -ForegroundColor Red -BackgroundColor Yellow ## Return the error to the caller # if the APIC returns a 403, the session most likely has been expired. Login again and rerun the API call if($resp.StatusCode -eq 403) { # We do this by resetting the global login variables and simply call the ACI-API-Call function again $global:LoggedIn = $False $global:LoggingIn = $False ACI-API-Call $method $encoding $url $headers $postData } $return_value.httpResponse = $resp.StatusDescription $return_value.httpCode = [int]$resp.StatusCode return $return_value } } # Use this function to login to the APIC function ACI-Login([string]$apic, [string]$username, [string]$password) { # This is the URL we're going to be logging in to $loginurl = "https://" + $apic + "/api/aaaLogin.xml" # Format the XML body for a login $creds = '<aaaUser name="' + $username + '" pwd="' + $password + '"/>' # Execute the API Call $result = ACI-API-Call "POST" "application/xml" $loginurl "" $creds if($result.httpResponse.Contains("Unauthorized")) { Write-Host "Authentication to APIC failed!" result 1 Exit } else { #Write-Host "Authenticated to the APIC!" } } $apic = "##system.hostname##" $username = "##aci.user##" $password = "##aci.pass##" ACI-Login $apic $username $password $url = "https://##system.hostname##/api/node/mo/topology/pod-1.json?query-target=children&target-subtree-class=fabricNode&query-target-filter=and(ne(fabricNode.role,%22controller%22))" $result = ACI-API-Call "GET" "application/json" $url "" $resultjson = $result.httpResponse | ConvertFrom-Json foreach ($nodeinfo in $resultjson.imdata) { $node = "node-$($nodeinfo.fabricNode.attributes.id)" ACI-Login $apic $username $password $url = "https://##system.hostname##/api/node/class/topology/pod-1/$node/l1PhysIf.json" $result2 = ACI-API-Call "GET" "application/json" $url "" $result2json = $result2.httpResponse | ConvertFrom-Json foreach ($data in $result2json.imdata) { $dn = $data.l1PhysIf.attributes.dn $url = "https://##system.hostname##/api/node/mo/$dn/phys.json" $result6 = ACI-API-Call "GET" "application/json" $url "" $result6json = $result6.httpResponse | ConvertFrom-Json $etherinfo = $result6json.imdata[0].ethpmPhysIf.attributes $unique = $($node + $($data.l1PhysIf.attributes.id)).replace("/","").Replace("-","") $ilps = "auto.nodename=$node" $ilps += "&auto.portoperSt=$($etherinfo.operSt)" $ilps += "&auto.portaccessVlan=$($etherinfo.accessVlan)" $ilps += "&auto.portallowedVlans=$($etherinfo.allowedVlans)" $ilps += "&auto.portadminSt=$($data.l1PhysIf.attributes.adminSt)" $ilps += "&auto.portautoNeg=$($data.l1PhysIf.attributes.autoNeg)" $ilps += "&auto.portbrkoutMap=$($data.l1PhysIf.attributes.brkoutMap)" $ilps += "&auto.portdn=$($data.l1PhysIf.attributes.dn)" $ilps += "&auto.portdescripton=$($data.l1PhysIf.attributes.descr)" $ilps += "&auto.portfecMode=$($data.l1PhysIf.attributes.fecMode)" $ilps += "&auto.portlayer=$($data.l1PhysIf.attributes.layer)" $ilps += "&auto.portlinkDebounce=$($data.l1PhysIf.attributes.linkDebounce)" $ilps += "&auto.portmdix=$($data.l1PhysIf.attributes.mdix)" $ilps += "&auto.portmedium=$($data.l1PhysIf.attributes.medium)" $ilps += "&auto.portmode=$($data.l1PhysIf.attributes.mode)" $ilps += "&auto.portmtu=$($data.l1PhysIf.attributes.mtu)" $ilps += "&auto.portportT=$($data.l1PhysIf.attributes.portT)" $ilps += "&auto.portprioFlowCtrl=$($data.l1PhysIf.attributes.prioFlowCtrl)" $ilps += "&auto.portspanMode=$($data.l1PhysIf.attributes.spanMode)" $ilps += "&auto.portspeed=$($data.l1PhysIf.attributes.speed)" $ilps += "&auto.portswitchingSt=$($data.l1PhysIf.attributes.switchingSt)" $ilps += "&auto.porttrunkLog=$($data.l1PhysIf.attributes.trunkLog)" $ilps += "&auto.portusage=$($data.l1PhysIf.attributes.usage)" $unique = $($node + $($data.l1PhysIf.attributes.id)).replace("/","").Replace("-","") write-host "$unique##$($node)_$($data.l1PhysIf.attributes.id)##$($data.l1PhysIf.attributes.descr)####$ilps" } } Collection: # This is where we save the cookies! $global:CookieJar = New-Object System.Net.CookieContainer $global:LoggedIn = $False $global:LoggingIn = $False function ACI-API-Call([string]$method, [string]$encoding, [string]$url, $headers, [string]$postData) { $return_value = New-Object PsObject -Property @{httpCode = ""; httpResponse = ""} ## Create the request [System.Net.HttpWebRequest] $request = [System.Net.HttpWebRequest] [System.Net.WebRequest]::Create($url) # Ignore SSL certificate errors [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} [System.Net.ServicePointManager]::SecurityProtocol = 3072 # <-- ACI NEEDS THIS!! # We want cookies! $request.CookieContainer = $global:CookieJar ## Add the method (GET, POST, etc.) $request.Method = $method ## Add an headers to the request foreach($key in $headers.keys) { $request.Headers.Add($key, $headers[$key]) } # If we're logged in, add the saved cookies to this request if ($global:LoggedIn -eq $True) { $request.CookieContainer = $global:CookieJar $global:LoggingIn = $False } else { # We're not logged in to the APIC, start login first if($global:LoggingIn -eq $False) { $global:LoggingIn = $True ACI-Login $apic $username $password } } ## We are using $encoding for the request as well as the expected response $request.Accept = $encoding ## Send a custom user agent if you want $request.UserAgent = "PowerShell script" ## Create the request body if the verb accepts it (NOTE: utf-8 is assumed here) if ($method -eq "POST" -or $method -eq "PUT") { $bytes = [System.Text.Encoding]::UTF8.GetBytes($postData) $request.ContentType = $encoding $request.ContentLength = $bytes.Length [System.IO.Stream] $outputStream = [System.IO.Stream]$request.GetRequestStream() $outputStream.Write($bytes,0,$bytes.Length) $outputStream.Close() } ## This is where we actually make the call. try { [System.Net.HttpWebResponse] $response = [System.Net.HttpWebResponse] $request.GetResponse() foreach($cookie in $response.Cookies) { # We've found the APIC cookie and can conclude our login business if($cookie.Name -eq "APIC-cookie") { $global:LoggedIn = $True $global:LoggingIn = $False } } $sr = New-Object System.IO.StreamReader($response.GetResponseStream()) $txt = $sr.ReadToEnd() ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host "CONTENT-TYPE: " $response.ContentType ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host "RAW RESPONSE DATA:" . $txt ## Return the response body to the caller $return_value.httpResponse = $txt $return_value.httpCode = [int]$response.StatusCode return $return_value } ## This catches errors from the server (404, 500, 501, etc.) catch [Net.WebException] { [System.Net.HttpWebResponse] $resp = [System.Net.HttpWebResponse] $_.Exception.Response ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host $resp.StatusCode -ForegroundColor Red -BackgroundColor Yellow ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host $resp.StatusDescription -ForegroundColor Red -BackgroundColor Yellow ## Return the error to the caller # if the APIC returns a 403, the session most likely has been expired. Login again and rerun the API call if($resp.StatusCode -eq 403) { # We do this by resetting the global login variables and simply call the ACI-API-Call function again $global:LoggedIn = $False $global:LoggingIn = $False ACI-API-Call $method $encoding $url $headers $postData } $return_value.httpResponse = $resp.StatusDescription $return_value.httpCode = [int]$resp.StatusCode return $return_value } } # Use this function to login to the APIC function ACI-Login([string]$apic, [string]$username, [string]$password) { # This is the URL we're going to be logging in to $loginurl = "https://" + $apic + "/api/aaaLogin.xml" # Format the XML body for a login $creds = '<aaaUser name="' + $username + '" pwd="' + $password + '"/>' # Execute the API Call $result = ACI-API-Call "POST" "application/xml" $loginurl "" $creds if($result.httpResponse.Contains("Unauthorized")) { Write-Host "Authentication to APIC failed!" result 1 Exit } else { #Write-Host "Authenticated to the APIC!" } } $apic = "##system.hostname##" $username = "##aci.user##" $password = "##aci.pass##" ACI-Login $apic $username $password $url = "https://##system.hostname##/api/node/mo/topology/pod-1.json?query-target=children&target-subtree-class=fabricNode&query-target-filter=and(ne(fabricNode.role,%22controller%22))" $result = ACI-API-Call "GET" "application/json" $url "" $resultjson = $result.httpResponse | ConvertFrom-Json foreach ($nodeinfo in $resultjson.imdata) { $node = "node-$($nodeinfo.fabricNode.attributes.id)" ACI-Login $apic $username $password $url = "https://##system.hostname##/api/node/class/topology/pod-1/$node/l1PhysIf.json?rsp-subtree-include=health" $result2 = ACI-API-Call "GET" "application/json" $url "" $result2json = $result2.httpResponse | ConvertFrom-Json foreach ($data in $result2json.imdata) { $unique = $($node + $($data.l1PhysIf.attributes.id)).replace("/","").Replace("-","") $dn = $data.l1PhysIf.attributes.dn $url = "https://##system.hostname##/api/node/mo/$dn/phys.json" $result6 = ACI-API-Call "GET" "application/json" $url "" $result6json = $result6.httpResponse | ConvertFrom-Json $etherinfo = $result6json.imdata[0].ethpmPhysIf.attributes if ($etherinfo.operSpeed -eq "inherit") {write-host "$unique.basicspeed=10737418240"} if ($etherinfo.operSpeed -eq "10G") {write-host "$unique.basicspeed=10737418240"} if ($etherinfo.operSpeed -eq "1G") {write-host "$unique.basicspeed=1073741824"} if ($etherinfo.operSpeed -eq "100M") {write-host "$unique.basicspeed=104857600"} if ($etherinfo.operSt -ne "up") {write-host "$unique.operSt=1"} if ($etherinfo.operSt -eq "up") {write-host "$unique.operSt=0"} write-host "$unique.operStQualCode=$($etherinfo.operStQualCode)" if ($etherinfo.operSt -eq "up") { $url = "https://##system.hostname##/api/node/mo/$dn/dbgEtherStats.json" $result3 = ACI-API-Call "GET" "application/json" $url "" $result3json = $result3.httpResponse | ConvertFrom-Json $etherstats = $result3json.imdata[0].rmonEtherStats.attributes if ($($data.l1PhysIf.attributes.adminSt) -ne "up") { write-host "$unique.adminSt=1" } if ($($data.l1PhysIf.attributes.adminSt) -eq "up") { write-host "$unique.adminSt=0" } write-host "$unique.healthScore=$($data.l1PhysIf.children[0].healthInst.attributes.cur)" write-host "$unique.broadcastPkts=$($etherstats.broadcastPkts)" write-host "$unique.cRCAlignErrors=$($etherstats.cRCAlignErrors)" write-host "$unique.collisions=$($etherstats.collisions)" write-host "$unique.dropEvents=$($etherstats.dropEvents)" write-host "$unique.fragments=$($etherstats.fragments)" write-host "$unique.jabbers=$($etherstats.jabbers)" write-host "$unique.multicastPkts=$($etherstats.multicastPkts)" write-host "$unique.octets=$($etherstats.octets)" write-host "$unique.oversizePkts=$($etherstats.oversizePkts)" write-host "$unique.pkts=$($etherstats.pkts)" write-host "$unique.pkts1024to1518Octets=$($etherstats.pkts1024to1518Octets)" write-host "$unique.pkts128to255Octets=$($etherstats.pkts128to255Octets)" write-host "$unique.pkts256to511Octets=$($etherstats.pkts256to511Octets)" write-host "$unique.pkts64Octets=$($etherstats.pkts64Octets)" write-host "$unique.pkts65to127Octets=$($etherstats.pkts65to127Octets)" write-host "$unique.rXNoErrors=$($etherstats.rXNoErrors)" write-host "$unique.rxOversizePkts=$($etherstats.rxOversizePkts)" write-host "$unique.tXNoErrors=$($etherstats.tXNoErrors)" write-host "$unique.txOversizePkts=$($etherstats.txOversizePkts)" write-host "$unique.undersizePkts=$($etherstats.undersizePkts)" $url = "https://##system.hostname##/api/node/mo/$dn/dbgIfIn.json" $result4 = ACI-API-Call "GET" "application/json" $url "" $result4json = $result4.httpResponse | ConvertFrom-Json $etherinstats = $result4json.imdata[0].rmonIfIn.attributes write-host "$unique.inbroadcastPkts=$($etherinstats.broadcastPkts)" write-host "$unique.indiscards=$($etherinstats.discards)" write-host "$unique.inerrors=$($etherinstats.errors)" write-host "$unique.inmulticastPkts=$($etherinstats.multicastPkts)" write-host "$unique.innUcastPkts=$($etherinstats.nUcastPkts)" write-host "$unique.inoctets=$($etherinstats.octets)" write-host "$unique.inucastPkts=$($etherinstats.ucastPkts)" $url = "https://##system.hostname##/api/node/mo/$dn/dbgIfOut.json" $result5 = ACI-API-Call "GET" "application/json" $url "" $result5json = $result5.httpResponse | ConvertFrom-Json $etheroutstats = $result5json.imdata[0].rmonIfOut.attributes write-host "$unique.outbroadcastPkts=$($etheroutstats.broadcastPkts)" write-host "$unique.outdiscards=$($etheroutstats.discards)" write-host "$unique.outerrors=$($etheroutstats.errors)" write-host "$unique.outmulticastPkts=$($etheroutstats.multicastPkts)" write-host "$unique.outnUcastPkts=$($etheroutstats.nUcastPkts)" write-host "$unique.outoctets=$($etheroutstats.octets)" write-host "$unique.outucastPkts=$($etheroutstats.ucastPkts)" } } } Full XML: <?xml version="1.0" encoding="UTF-8" ?> <feed version="1.0" hasPendingRequests="false" > <company></company> <status>200</status> <errmsg>OK</errmsg> <interval>0</interval> <entry type="predatasource"> <version>1516221145</version> <name>Cisco ACI Fabric Physical Interfaces-</name> <displayedas>Physical Interfaces-</displayedas> <description>Checks the ACI Physical Interfaces</description> <collector>batchscript</collector> <hasMultiInstances>true</hasMultiInstances> <schedule>180</schedule> <appliesTo>aci.user && aci.pass</appliesTo> <wildcardauto>true</wildcardauto> <wildcardpersist>false</wildcardpersist> <wildcardlinuxscript>ad_script</wildcardlinuxscript> <wildcardlinuxcmdline>type="powerShell" </wildcardlinuxcmdline> <wildcardwinscript>ad_script</wildcardwinscript> <wildcardwincmdline>type="powerShell" </wildcardwincmdline> <wildcardgroovyscript># This is where we save the cookies! $global:CookieJar = New-Object System.Net.CookieContainer $global:LoggedIn = $False $global:LoggingIn = $False function ACI-API-Call([string]$method, [string]$encoding, [string]$url, $headers, [string]$postData) { $return_value = New-Object PsObject -Property @{httpCode = ""; httpResponse = ""} ## Create the request [System.Net.HttpWebRequest] $request = [System.Net.HttpWebRequest] [System.Net.WebRequest]::Create($url) # Ignore SSL certificate errors [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} [System.Net.ServicePointManager]::SecurityProtocol = 3072 # <-- ACI NEEDS THIS!! # We want cookies! $request.CookieContainer = $global:CookieJar ## Add the method (GET, POST, etc.) $request.Method = $method ## Add an headers to the request foreach($key in $headers.keys) { $request.Headers.Add($key, $headers[$key]) } # If we're logged in, add the saved cookies to this request if ($global:LoggedIn -eq $True) { $request.CookieContainer = $global:CookieJar $global:LoggingIn = $False } else { # We're not logged in to the APIC, start login first if($global:LoggingIn -eq $False) { $global:LoggingIn = $True ACI-Login $apic $username $password } } ## We are using $encoding for the request as well as the expected response $request.Accept = $encoding ## Send a custom user agent if you want $request.UserAgent = "PowerShell script" ## Create the request body if the verb accepts it (NOTE: utf-8 is assumed here) if ($method -eq "POST" -or $method -eq "PUT") { $bytes = [System.Text.Encoding]::UTF8.GetBytes($postData) $request.ContentType = $encoding $request.ContentLength = $bytes.Length [System.IO.Stream] $outputStream = [System.IO.Stream]$request.GetRequestStream() $outputStream.Write($bytes,0,$bytes.Length) $outputStream.Close() } ## This is where we actually make the call. try { [System.Net.HttpWebResponse] $response = [System.Net.HttpWebResponse] $request.GetResponse() foreach($cookie in $response.Cookies) { # We've found the APIC cookie and can conclude our login business if($cookie.Name -eq "APIC-cookie") { $global:LoggedIn = $True $global:LoggingIn = $False } } $sr = New-Object System.IO.StreamReader($response.GetResponseStream()) $txt = $sr.ReadToEnd() ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host "CONTENT-TYPE: " $response.ContentType ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host "RAW RESPONSE DATA:" . $txt ## Return the response body to the caller $return_value.httpResponse = $txt $return_value.httpCode = [int]$response.StatusCode return $return_value } ## This catches errors from the server (404, 500, 501, etc.) catch [Net.WebException] { [System.Net.HttpWebResponse] $resp = [System.Net.HttpWebResponse] $_.Exception.Response ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host $resp.StatusCode -ForegroundColor Red -BackgroundColor Yellow ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host $resp.StatusDescription -ForegroundColor Red -BackgroundColor Yellow ## Return the error to the caller # if the APIC returns a 403, the session most likely has been expired. Login again and rerun the API call if($resp.StatusCode -eq 403) { # We do this by resetting the global login variables and simply call the ACI-API-Call function again $global:LoggedIn = $False $global:LoggingIn = $False ACI-API-Call $method $encoding $url $headers $postData } $return_value.httpResponse = $resp.StatusDescription $return_value.httpCode = [int]$resp.StatusCode return $return_value } } # Use this function to login to the APIC function ACI-Login([string]$apic, [string]$username, [string]$password) { # This is the URL we're going to be logging in to $loginurl = "https://" + $apic + "/api/aaaLogin.xml" # Format the XML body for a login $creds = '<aaaUser name="' + $username + '" pwd="' + $password + '"/>' # Execute the API Call $result = ACI-API-Call "POST" "application/xml" $loginurl "" $creds if($result.httpResponse.Contains("Unauthorized")) { Write-Host "Authentication to APIC failed!" result 1 Exit } else { #Write-Host "Authenticated to the APIC!" } } $apic = "##system.hostname##" $username = "##aci.user##" $password = "##aci.pass##" ACI-Login $apic $username $password $url = "https://##system.hostname##/api/node/mo/topology/pod-1.json?query-target=children&target-subtree-class=fabricNode&query-target-filter=and(ne(fabricNode.role,%22controller%22))" $result = ACI-API-Call "GET" "application/json" $url "" $resultjson = $result.httpResponse | ConvertFrom-Json foreach ($nodeinfo in $resultjson.imdata) { $node = "node-$($nodeinfo.fabricNode.attributes.id)" ACI-Login $apic $username $password $url = "https://##system.hostname##/api/node/class/topology/pod-1/$node/l1PhysIf.json" $result2 = ACI-API-Call "GET" "application/json" $url "" $result2json = $result2.httpResponse | ConvertFrom-Json foreach ($data in $result2json.imdata) { $dn = $data.l1PhysIf.attributes.dn $url = "https://##system.hostname##/api/node/mo/$dn/phys.json" $result6 = ACI-API-Call "GET" "application/json" $url "" $result6json = $result6.httpResponse | ConvertFrom-Json $etherinfo = $result6json.imdata[0].ethpmPhysIf.attributes $unique = $($node + $($data.l1PhysIf.attributes.id)).replace("/","").Replace("-","") $ilps = "auto.nodename=$node" $ilps += "&auto.portoperSt=$($etherinfo.operSt)" $ilps += "&auto.portaccessVlan=$($etherinfo.accessVlan)" $ilps += "&auto.portallowedVlans=$($etherinfo.allowedVlans)" $ilps += "&auto.portadminSt=$($data.l1PhysIf.attributes.adminSt)" $ilps += "&auto.portautoNeg=$($data.l1PhysIf.attributes.autoNeg)" $ilps += "&auto.portbrkoutMap=$($data.l1PhysIf.attributes.brkoutMap)" $ilps += "&auto.portdn=$($data.l1PhysIf.attributes.dn)" $ilps += "&auto.portdescripton=$($data.l1PhysIf.attributes.descr)" $ilps += "&auto.portfecMode=$($data.l1PhysIf.attributes.fecMode)" $ilps += "&auto.portlayer=$($data.l1PhysIf.attributes.layer)" $ilps += "&auto.portlinkDebounce=$($data.l1PhysIf.attributes.linkDebounce)" $ilps += "&auto.portmdix=$($data.l1PhysIf.attributes.mdix)" $ilps += "&auto.portmedium=$($data.l1PhysIf.attributes.medium)" $ilps += "&auto.portmode=$($data.l1PhysIf.attributes.mode)" $ilps += "&auto.portmtu=$($data.l1PhysIf.attributes.mtu)" $ilps += "&auto.portportT=$($data.l1PhysIf.attributes.portT)" $ilps += "&auto.portprioFlowCtrl=$($data.l1PhysIf.attributes.prioFlowCtrl)" $ilps += "&auto.portspanMode=$($data.l1PhysIf.attributes.spanMode)" $ilps += "&auto.portspeed=$($data.l1PhysIf.attributes.speed)" $ilps += "&auto.portswitchingSt=$($data.l1PhysIf.attributes.switchingSt)" $ilps += "&auto.porttrunkLog=$($data.l1PhysIf.attributes.trunkLog)" $ilps += "&auto.portusage=$($data.l1PhysIf.attributes.usage)" $unique = $($node + $($data.l1PhysIf.attributes.id)).replace("/","").Replace("-","") write-host "$unique##$($node)_$($data.l1PhysIf.attributes.id)##$($data.l1PhysIf.attributes.descr)####$ilps" } } </wildcardgroovyscript> <wildcardschedule>1440</wildcardschedule> <wildcarddisable>false</wildcarddisable> <wildcarddeleteinactive>false</wildcarddeleteinactive> <agdmethod>ilp</agdmethod> <agdparams>auto.nodename</agdparams> <group>Cisco ACI Fabric</group> <tags></tags> <technology>requires powershell</technology> <adlist><![CDATA[{"agdmethod":"ilp","method":"ad_script","agdparams":"auto.nodename","id":0,"filters":[{"attribute":"auto.portoperSt","operation":"NotEqual","value":"down"}],"params":{"type":"powerShell","groovyscript":"# This is where we save the cookies!\r\n$global:CookieJar = New-Object System.Net.CookieContainer\r\n$global:LoggedIn = $False\r\n$global:LoggingIn = $False\r\n\r\nfunction ACI-API-Call([string]$method, [string]$encoding, [string]$url, $headers, [string]$postData)\r\n{\r\n $return_value = New-Object PsObject -Property @{httpCode = \"\"; httpResponse = \"\"}\r\n\r\n ## Create the request\r\n [System.Net.HttpWebRequest] $request = [System.Net.HttpWebRequest] [System.Net.WebRequest]::Create($url)\r\n\r\n # Ignore SSL certificate errors\r\n [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}\r\n [System.Net.ServicePointManager]::SecurityProtocol = 3072 # <-- ACI NEEDS THIS!!\r\n\r\n # We want cookies!\r\n $request.CookieContainer = $global:CookieJar\r\n\r\n ## Add the method (GET, POST, etc.)\r\n $request.Method = $method\r\n ## Add an headers to the request\r\n foreach($key in $headers.keys)\r\n {\r\n $request.Headers.Add($key, $headers[$key])\r\n }\r\n\r\n # If we're logged in, add the saved cookies to this request\r\n if ($global:LoggedIn -eq $True) {\r\n $request.CookieContainer = $global:CookieJar\r\n $global:LoggingIn = $False\r\n }\r\n else\r\n {\r\n # We're not logged in to the APIC, start login first\r\n if($global:LoggingIn -eq $False)\r\n {\r\n $global:LoggingIn = $True\r\n ACI-Login $apic $username $password\r\n }\r\n }\r\n\r\n ## We are using $encoding for the request as well as the expected response\r\n $request.Accept = $encoding\r\n ## Send a custom user agent if you want\r\n $request.UserAgent = \"PowerShell script\"\r\n\r\n ## Create the request body if the verb accepts it (NOTE: utf-8 is assumed here)\r\n if ($method -eq \"POST\" -or $method -eq \"PUT\") {\r\n $bytes = [System.Text.Encoding]::UTF8.GetBytes($postData)\r\n $request.ContentType = $encoding\r\n $request.ContentLength = $bytes.Length\r\n\r\n [System.IO.Stream] $outputStream = [System.IO.Stream]$request.GetRequestStream()\r\n $outputStream.Write($bytes,0,$bytes.Length)\r\n $outputStream.Close()\r\n }\r\n\r\n ## This is where we actually make the call.\r\n try\r\n {\r\n [System.Net.HttpWebResponse] $response = [System.Net.HttpWebResponse] $request.GetResponse()\r\n\r\n foreach($cookie in $response.Cookies)\r\n {\r\n # We've found the APIC cookie and can conclude our login business\r\n if($cookie.Name -eq \"APIC-cookie\")\r\n {\r\n $global:LoggedIn = $True\r\n $global:LoggingIn = $False\r\n }\r\n }\r\n\r\n $sr = New-Object System.IO.StreamReader($response.GetResponseStream())\r\n $txt = $sr.ReadToEnd()\r\n ## NOTE: comment out the next line if you don't want this function to print to the terminal\r\n #Write-Host \"CONTENT-TYPE: \" $response.ContentType\r\n ## NOTE: comment out the next line if you don't want this function to print to the terminal\r\n #Write-Host \"RAW RESPONSE DATA:\" . $txt\r\n ## Return the response body to the caller\r\n $return_value.httpResponse = $txt\r\n $return_value.httpCode = [int]$response.StatusCode\r\n return $return_value\r\n }\r\n ## This catches errors from the server (404, 500, 501, etc.)\r\n catch [Net.WebException] {\r\n [System.Net.HttpWebResponse] $resp = [System.Net.HttpWebResponse] $_.Exception.Response\r\n ## NOTE: comment out the next line if you don't want this function to print to the terminal\r\n #Write-Host $resp.StatusCode -ForegroundColor Red -BackgroundColor Yellow\r\n ## NOTE: comment out the next line if you don't want this function to print to the terminal\r\n #Write-Host $resp.StatusDescription -ForegroundColor Red -BackgroundColor Yellow\r\n ## Return the error to the caller\r\n\r\n # if the APIC returns a 403, the session most likely has been expired. Login again and rerun the API call\r\n if($resp.StatusCode -eq 403)\r\n {\r\n # We do this by resetting the global login variables and simply call the ACI-API-Call function again\r\n $global:LoggedIn = $False\r\n $global:LoggingIn = $False\r\n ACI-API-Call $method $encoding $url $headers $postData\r\n }\r\n\r\n $return_value.httpResponse = $resp.StatusDescription\r\n $return_value.httpCode = [int]$resp.StatusCode\r\n return $return_value\r\n }\r\n}\r\n\r\n# Use this function to login to the APIC\r\nfunction ACI-Login([string]$apic, [string]$username, [string]$password)\r\n{\r\n # This is the URL we're going to be logging in to\r\n $loginurl = \"https://\" + $apic + \"/api/aaaLogin.xml\"\r\n # Format the XML body for a login\r\n $creds = '<aaaUser name=\"' + $username + '\" pwd=\"' + $password + '\"/>'\r\n # Execute the API Call\r\n $result = ACI-API-Call \"POST\" \"application/xml\" $loginurl \"\" $creds\r\n\r\n if($result.httpResponse.Contains(\"Unauthorized\")) {\r\n Write-Host \"Authentication to APIC failed!\"\r\n result 1\r\n Exit\r\n }\r\n else {\r\n #Write-Host \"Authenticated to the APIC!\"\r\n }\r\n}\r\n\r\n$apic = \"##system.hostname##\"\r\n$username = \"##aci.user##\"\r\n$password = \"##aci.pass##\"\r\n\r\nACI-Login $apic $username $password\r\n$url = \"https://##system.hostname##/api/node/mo/topology/pod-1.json?query-target=children&target-subtree-class=fabricNode&query-target-filter=and(ne(fabricNode.role,%22controller%22))\" \r\n$result = ACI-API-Call \"GET\" \"application/json\" $url \"\"\r\n$resultjson = $result.httpResponse | ConvertFrom-Json\r\n\r\nforeach ($nodeinfo in $resultjson.imdata) {\r\n $node = \"node-$($nodeinfo.fabricNode.attributes.id)\"\r\n ACI-Login $apic $username $password\r\n $url = \"https://##system.hostname##/api/node/class/topology/pod-1/$node/l1PhysIf.json\" \r\n $result2 = ACI-API-Call \"GET\" \"application/json\" $url \"\"\r\n $result2json = $result2.httpResponse | ConvertFrom-Json\r\n \r\n foreach ($data in $result2json.imdata) {\r\n $dn = $data.l1PhysIf.attributes.dn\r\n $url = \"https://##system.hostname##/api/node/mo/$dn/phys.json\" \r\n $result6 = ACI-API-Call \"GET\" \"application/json\" $url \"\"\r\n $result6json = $result6.httpResponse | ConvertFrom-Json\r\n $etherinfo = $result6json.imdata[0].ethpmPhysIf.attributes\r\n\r\n $unique = $($node + $($data.l1PhysIf.attributes.id)).replace(\"/\",\"\").Replace(\"-\",\"\")\r\n $ilps = \"auto.nodename=$node\"\r\n $ilps += \"&auto.portoperSt=$($etherinfo.operSt)\"\r\n $ilps += \"&auto.portaccessVlan=$($etherinfo.accessVlan)\"\r\n $ilps += \"&auto.portallowedVlans=$($etherinfo.allowedVlans)\"\r\n $ilps += \"&auto.portadminSt=$($data.l1PhysIf.attributes.adminSt)\"\r\n $ilps += \"&auto.portautoNeg=$($data.l1PhysIf.attributes.autoNeg)\"\r\n $ilps += \"&auto.portbrkoutMap=$($data.l1PhysIf.attributes.brkoutMap)\"\r\n $ilps += \"&auto.portdn=$($data.l1PhysIf.attributes.dn)\"\r\n $ilps += \"&auto.portdescripton=$($data.l1PhysIf.attributes.descr)\"\r\n $ilps += \"&auto.portfecMode=$($data.l1PhysIf.attributes.fecMode)\"\r\n $ilps += \"&auto.portlayer=$($data.l1PhysIf.attributes.layer)\"\r\n $ilps += \"&auto.portlinkDebounce=$($data.l1PhysIf.attributes.linkDebounce)\"\r\n $ilps += \"&auto.portmdix=$($data.l1PhysIf.attributes.mdix)\"\r\n $ilps += \"&auto.portmedium=$($data.l1PhysIf.attributes.medium)\"\r\n $ilps += \"&auto.portmode=$($data.l1PhysIf.attributes.mode)\"\r\n $ilps += \"&auto.portmtu=$($data.l1PhysIf.attributes.mtu)\"\r\n $ilps += \"&auto.portportT=$($data.l1PhysIf.attributes.portT)\"\r\n $ilps += \"&auto.portprioFlowCtrl=$($data.l1PhysIf.attributes.prioFlowCtrl)\"\r\n $ilps += \"&auto.portspanMode=$($data.l1PhysIf.attributes.spanMode)\"\r\n $ilps += \"&auto.portspeed=$($data.l1PhysIf.attributes.speed)\"\r\n $ilps += \"&auto.portswitchingSt=$($data.l1PhysIf.attributes.switchingSt)\"\r\n $ilps += \"&auto.porttrunkLog=$($data.l1PhysIf.attributes.trunkLog)\"\r\n $ilps += \"&auto.portusage=$($data.l1PhysIf.attributes.usage)\"\r\n $unique = $($node + $($data.l1PhysIf.attributes.id)).replace(\"/\",\"\").Replace(\"-\",\"\")\r\n write-host \"$unique##$($node)_$($data.l1PhysIf.attributes.id)##$($data.l1PhysIf.attributes.descr)####$ilps\"\r\n }\r\n}\r\n"}}]]></adlist> <schemaVersion>2</schemaVersion> <dataSourceType>1</dataSourceType> <attributes> <attribute> <name>scripttype</name> <value>powerShell</value> <comment></comment> </attribute> <attribute> <name>scriptgroovy</name> <value># This is where we save the cookies! $global:CookieJar = New-Object System.Net.CookieContainer $global:LoggedIn = $False $global:LoggingIn = $False function ACI-API-Call([string]$method, [string]$encoding, [string]$url, $headers, [string]$postData) { $return_value = New-Object PsObject -Property @{httpCode = ""; httpResponse = ""} ## Create the request [System.Net.HttpWebRequest] $request = [System.Net.HttpWebRequest] [System.Net.WebRequest]::Create($url) # Ignore SSL certificate errors [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} [System.Net.ServicePointManager]::SecurityProtocol = 3072 # <-- ACI NEEDS THIS!! # We want cookies! $request.CookieContainer = $global:CookieJar ## Add the method (GET, POST, etc.) $request.Method = $method ## Add an headers to the request foreach($key in $headers.keys) { $request.Headers.Add($key, $headers[$key]) } # If we're logged in, add the saved cookies to this request if ($global:LoggedIn -eq $True) { $request.CookieContainer = $global:CookieJar $global:LoggingIn = $False } else { # We're not logged in to the APIC, start login first if($global:LoggingIn -eq $False) { $global:LoggingIn = $True ACI-Login $apic $username $password } } ## We are using $encoding for the request as well as the expected response $request.Accept = $encoding ## Send a custom user agent if you want $request.UserAgent = "PowerShell script" ## Create the request body if the verb accepts it (NOTE: utf-8 is assumed here) if ($method -eq "POST" -or $method -eq "PUT") { $bytes = [System.Text.Encoding]::UTF8.GetBytes($postData) $request.ContentType = $encoding $request.ContentLength = $bytes.Length [System.IO.Stream] $outputStream = [System.IO.Stream]$request.GetRequestStream() $outputStream.Write($bytes,0,$bytes.Length) $outputStream.Close() } ## This is where we actually make the call. try { [System.Net.HttpWebResponse] $response = [System.Net.HttpWebResponse] $request.GetResponse() foreach($cookie in $response.Cookies) { # We've found the APIC cookie and can conclude our login business if($cookie.Name -eq "APIC-cookie") { $global:LoggedIn = $True $global:LoggingIn = $False } } $sr = New-Object System.IO.StreamReader($response.GetResponseStream()) $txt = $sr.ReadToEnd() ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host "CONTENT-TYPE: " $response.ContentType ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host "RAW RESPONSE DATA:" . $txt ## Return the response body to the caller $return_value.httpResponse = $txt $return_value.httpCode = [int]$response.StatusCode return $return_value } ## This catches errors from the server (404, 500, 501, etc.) catch [Net.WebException] { [System.Net.HttpWebResponse] $resp = [System.Net.HttpWebResponse] $_.Exception.Response ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host $resp.StatusCode -ForegroundColor Red -BackgroundColor Yellow ## NOTE: comment out the next line if you don't want this function to print to the terminal #Write-Host $resp.StatusDescription -ForegroundColor Red -BackgroundColor Yellow ## Return the error to the caller # if the APIC returns a 403, the session most likely has been expired. Login again and rerun the API call if($resp.StatusCode -eq 403) { # We do this by resetting the global login variables and simply call the ACI-API-Call function again $global:LoggedIn = $False $global:LoggingIn = $False ACI-API-Call $method $encoding $url $headers $postData } $return_value.httpResponse = $resp.StatusDescription $return_value.httpCode = [int]$resp.StatusCode return $return_value } } # Use this function to login to the APIC function ACI-Login([string]$apic, [string]$username, [string]$password) { # This is the URL we're going to be logging in to $loginurl = "https://" + $apic + "/api/aaaLogin.xml" # Format the XML body for a login $creds = '<aaaUser name="' + $username + '" pwd="' + $password + '"/>' # Execute the API Call $result = ACI-API-Call "POST" "application/xml" $loginurl "" $creds if($result.httpResponse.Contains("Unauthorized")) { Write-Host "Authentication to APIC failed!" result 1 Exit } else { #Write-Host "Authenticated to the APIC!" } } $apic = "##system.hostname##" $username = "##aci.user##" $password = "##aci.pass##" ACI-Login $apic $username $password $url = "https://##system.hostname##/api/node/mo/topology/pod-1.json?query-target=children&target-subtree-class=fabricNode&query-target-filter=and(ne(fabricNode.role,%22controller%22))" $result = ACI-API-Call "GET" "application/json" $url "" $resultjson = $result.httpResponse | ConvertFrom-Json foreach ($nodeinfo in $resultjson.imdata) { $node = "node-$($nodeinfo.fabricNode.attributes.id)" ACI-Login $apic $username $password $url = "https://##system.hostname##/api/node/class/topology/pod-1/$node/l1PhysIf.json?rsp-subtree-include=health" $result2 = ACI-API-Call "GET" "application/json" $url "" $result2json = $result2.httpResponse | ConvertFrom-Json foreach ($data in $result2json.imdata) { $unique = $($node + $($data.l1PhysIf.attributes.id)).replace("/","").Replace("-","") $dn = $data.l1PhysIf.attributes.dn $url = "https://##system.hostname##/api/node/mo/$dn/phys.json" $result6 = ACI-API-Call "GET" "application/json" $url "" $result6json = $result6.httpResponse | ConvertFrom-Json $etherinfo = $result6json.imdata[0].ethpmPhysIf.attributes if ($etherinfo.operSpeed -eq "inherit") {write-host "$unique.basicspeed=10737418240"} if ($etherinfo.operSpeed -eq "10G") {write-host "$unique.basicspeed=10737418240"} if ($etherinfo.operSpeed -eq "1G") {write-host "$unique.basicspeed=1073741824"} if ($etherinfo.operSpeed -eq "100M") {write-host "$unique.basicspeed=104857600"} if ($etherinfo.operSt -ne "up") {write-host "$unique.operSt=1"} if ($etherinfo.operSt -eq "up") {write-host "$unique.operSt=0"} write-host "$unique.operStQualCode=$($etherinfo.operStQualCode)" if ($etherinfo.operSt -eq "up") { $url = "https://##system.hostname##/api/node/mo/$dn/dbgEtherStats.json" $result3 = ACI-API-Call "GET" "application/json" $url "" $result3json = $result3.httpResponse | ConvertFrom-Json $etherstats = $result3json.imdata[0].rmonEtherStats.attributes if ($($data.l1PhysIf.attributes.adminSt) -ne "up") { write-host "$unique.adminSt=1" } if ($($data.l1PhysIf.attributes.adminSt) -eq "up") { write-host "$unique.adminSt=0" } write-host "$unique.healthScore=$($data.l1PhysIf.children[0].healthInst.attributes.cur)" write-host "$unique.broadcastPkts=$($etherstats.broadcastPkts)" write-host "$unique.cRCAlignErrors=$($etherstats.cRCAlignErrors)" write-host "$unique.collisions=$($etherstats.collisions)" write-host "$unique.dropEvents=$($etherstats.dropEvents)" write-host "$unique.fragments=$($etherstats.fragments)" write-host "$unique.jabbers=$($etherstats.jabbers)" write-host "$unique.multicastPkts=$($etherstats.multicastPkts)" write-host "$unique.octets=$($etherstats.octets)" write-host "$unique.oversizePkts=$($etherstats.oversizePkts)" write-host "$unique.pkts=$($etherstats.pkts)" write-host "$unique.pkts1024to1518Octets=$($etherstats.pkts1024to1518Octets)" write-host "$unique.pkts128to255Octets=$($etherstats.pkts128to255Octets)" write-host "$unique.pkts256to511Octets=$($etherstats.pkts256to511Octets)" write-host "$unique.pkts64Octets=$($etherstats.pkts64Octets)" write-host "$unique.pkts65to127Octets=$($etherstats.pkts65to127Octets)" write-host "$unique.rXNoErrors=$($etherstats.rXNoErrors)" write-host "$unique.rxOversizePkts=$($etherstats.rxOversizePkts)" write-host "$unique.tXNoErrors=$($etherstats.tXNoErrors)" write-host "$unique.txOversizePkts=$($etherstats.txOversizePkts)" write-host "$unique.undersizePkts=$($etherstats.undersizePkts)" $url = "https://##system.hostname##/api/node/mo/$dn/dbgIfIn.json" $result4 = ACI-API-Call "GET" "application/json" $url "" $result4json = $result4.httpResponse | ConvertFrom-Json $etherinstats = $result4json.imdata[0].rmonIfIn.attributes write-host "$unique.inbroadcastPkts=$($etherinstats.broadcastPkts)" write-host "$unique.indiscards=$($etherinstats.discards)" write-host "$unique.inerrors=$($etherinstats.errors)" write-host "$unique.inmulticastPkts=$($etherinstats.multicastPkts)" write-host "$unique.innUcastPkts=$($etherinstats.nUcastPkts)" write-host "$unique.inoctets=$($etherinstats.octets)" write-host "$unique.inucastPkts=$($etherinstats.ucastPkts)" $url = "https://##system.hostname##/api/node/mo/$dn/dbgIfOut.json" $result5 = ACI-API-Call "GET" "application/json" $url "" $result5json = $result5.httpResponse | ConvertFrom-Json $etheroutstats = $result5json.imdata[0].rmonIfOut.attributes write-host "$unique.outbroadcastPkts=$($etheroutstats.broadcastPkts)" write-host "$unique.outdiscards=$($etheroutstats.discards)" write-host "$unique.outerrors=$($etheroutstats.errors)" write-host "$unique.outmulticastPkts=$($etheroutstats.multicastPkts)" write-host "$unique.outnUcastPkts=$($etheroutstats.nUcastPkts)" write-host "$unique.outoctets=$($etheroutstats.octets)" write-host "$unique.outucastPkts=$($etheroutstats.ucastPkts)" } } }</value> <comment></comment> </attribute> <attribute> <name>windowsscript</name> <value></value> <comment></comment> </attribute> <attribute> <name>linuxscript</name> <value></value> <comment></comment> </attribute> <attribute> <name>windowscmdline</name> <value></value> <comment></comment> </attribute> <attribute> <name>linuxcmdline</name> <value></value> <comment></comment> </attribute> <attribute> <name>__filter_0</name> <value>auto.portoperSt NotEqual down</value> <comment></comment> </attribute> </attributes> <datapoints> <datapoint> <name>adminSt</name> <dataType>7</dataType> <type>2</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.adminSt</postprocessorparam> <usevalue>output</usevalue> <alertexpr>!= 0</alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue>1</maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>InOctets</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.inoctets</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>OutOctets</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.outoctets</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>pkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.pkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>broadcastPkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.broadcastPkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>collisions</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.collisions</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>cRCAlignErrors</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.cRCAlignErrors</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>dropEvents</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.dropEvents</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>fragments</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.fragments</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>inbroadcastPkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.inbroadcastPkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>indiscards</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.indiscards</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>inerrors</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.inerrors</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>inmulticastPkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.inmulticastPkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>innUcastPkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.innUcastPkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>inucastPkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.inucastPkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>jabbers</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.jabbers</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>multicastPkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.multicastPkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>octets</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.octets</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>outbroadcastPkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.outbroadcastPkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>outdiscards</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.outdiscards</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>outerrors</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.outerrors</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>outmulticastPkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.outmulticastPkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>outnUcastPkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.outnUcastPkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>outucastPkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.outucastPkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>oversizePkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.oversizePkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>pkts1024to1518Octets</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.pkts1024to1518Octets</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>pkts128to255Octets</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.pkts128to255Octets</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>pkts256to511Octets</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.pkts256to511Octets</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>pkts64Octets</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.pkts64Octets</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>pkts65to127Octets</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.pkts65to127Octets</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>rXNoErrors</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.rXNoErrors</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>rxOversizePkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.rxOversizePkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>tXNoErrors</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.tXNoErrors</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>txOversizePkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.txOversizePkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>undersizePkts</name> <dataType>7</dataType> <type>3</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.undersizePkts</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>basicspeed</name> <dataType>7</dataType> <type>2</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.basicspeed</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue></minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>operSt</name> <dataType>7</dataType> <type>2</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.operSt</postprocessorparam> <usevalue>output</usevalue> <alertexpr>!= 0</alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue>1</maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>2</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>operStQualCode</name> <dataType>7</dataType> <type>2</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.operStQualCode</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue></maxvalue> <minvalue></minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> <datapoint> <name>healthScore</name> <dataType>7</dataType> <type>2</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>##WILDVALUE##.healthScore</postprocessorparam> <usevalue>output</usevalue> <alertexpr>!= 100</alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <description></description> <maxvalue>100</maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>2</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> </datapoints> <graphs> <graph> <name>Drops/Errors</name> <title>Drops/Errors for ##INSTANCE## ##DESCRIPTION##</title> <verticallabel>Packets/sec</verticallabel> <rigid>false</rigid> <maxvalue>NaN</maxvalue> <minvalue>0.0</minvalue> <displayprio>3</displayprio> <timescale>1day</timescale> <base1024>false</base1024> <graphdatapoints> <graphdatapoint> <name>indiscards</name> <datapointname>indiscards</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>inerrors</name> <datapointname>inerrors</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>outdiscards</name> <datapointname>outdiscards</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>outerrors</name> <datapointname>outerrors</datapointname> <cf>2</cf> </graphdatapoint> </graphdatapoints> <graphvirtualdatapoints> </graphvirtualdatapoints> <graphdatas> <graphdata> <type>1</type> <legend>In Discards</legend> <color>orange</color> <datapointname>indiscards</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> <graphdata> <type>1</type> <legend>In Errors</legend> <color>red</color> <datapointname>inerrors</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> <graphdata> <type>1</type> <legend>Out Discards</legend> <color>purple</color> <datapointname>outdiscards</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> <graphdata> <type>1</type> <legend>Out Errors</legend> <color>gray</color> <datapointname>outerrors</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> </graphdatas> </graph> <graph> <name>Health Score</name> <title>Health Score</title> <verticallabel>%</verticallabel> <rigid>false</rigid> <maxvalue>100.0</maxvalue> <minvalue>0.0</minvalue> <displayprio>1</displayprio> <timescale>1day</timescale> <base1024>false</base1024> <graphdatapoints> <graphdatapoint> <name>healthScore</name> <datapointname>healthScore</datapointname> <cf>2</cf> </graphdatapoint> </graphdatapoints> <graphvirtualdatapoints> </graphvirtualdatapoints> <graphdatas> <graphdata> <type>1</type> <legend>Health Score</legend> <color>silver</color> <datapointname>healthScore</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> </graphdatas> </graph> <graph> <name>Packets</name> <title>Packets for ##INSTANCE## ##DESCRIPTION##</title> <verticallabel>Packets/sec</verticallabel> <rigid>false</rigid> <maxvalue>NaN</maxvalue> <minvalue>0.0</minvalue> <displayprio>2</displayprio> <timescale>1day</timescale> <base1024>false</base1024> <graphdatapoints> <graphdatapoint> <name>inbroadcastPkts</name> <datapointname>inbroadcastPkts</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>inmulticastPkts</name> <datapointname>inmulticastPkts</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>innUcastPkts</name> <datapointname>inucastPkts</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>outbroadcastPkts</name> <datapointname>outbroadcastPkts</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>outmulticastPkts</name> <datapointname>outmulticastPkts</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>outnUcastPkts</name> <datapointname>outucastPkts</datapointname> <cf>2</cf> </graphdatapoint> </graphdatapoints> <graphvirtualdatapoints> <graphvirtualdatapoint> <name>InNonUni</name> <rpn>inmulticastPkts+inbroadcastPkts</rpn> </graphvirtualdatapoint> <graphvirtualdatapoint> <name>OutNonUni</name> <rpn>outmulticastPkts+outbroadcastPkts</rpn> </graphvirtualdatapoint> </graphvirtualdatapoints> <graphdatas> <graphdata> <type>1</type> <legend>In Unicast</legend> <color>blue</color> <datapointname>innUcastPkts</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> <graphdata> <type>1</type> <legend>Out Unicast</legend> <color>green</color> <datapointname>outnUcastPkts</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> <graphdata> <type>1</type> <legend>In (b/m)cast</legend> <color>purple</color> <datapointname>InNonUni</datapointname> <isvirtualdatapoint>true</isvirtualdatapoint> </graphdata> <graphdata> <type>1</type> <legend>Out (b/m)cast</legend> <color>maroon</color> <datapointname>OutNonUni</datapointname> <isvirtualdatapoint>true</isvirtualdatapoint> </graphdata> </graphdatas> </graph> <graph> <name>Status</name> <title>Status for ##INSTANCE## ##DESCRIPTION##</title> <verticallabel>status</verticallabel> <rigid>false</rigid> <maxvalue>2.0</maxvalue> <minvalue>-1.0</minvalue> <displayprio>1</displayprio> <timescale>1day</timescale> <base1024>false</base1024> <graphdatapoints> <graphdatapoint> <name>adminSt</name> <datapointname>adminSt</datapointname> <cf>2</cf> </graphdatapoint> </graphdatapoints> <graphvirtualdatapoints> </graphvirtualdatapoints> <graphdatas> <graphdata> <type>1</type> <legend>Admin State</legend> <color>silver</color> <datapointname>adminSt</datapointname> <isvirtualdatapoint>false</isvirtualdatapoint> </graphdata> </graphdatas> </graph> <graph> <name>Throughput</name> <title>Throughput for ##INSTANCE## ##DESCRIPTION##</title> <verticallabel>bit/sec</verticallabel> <rigid>false</rigid> <maxvalue>NaN</maxvalue> <minvalue>0.0</minvalue> <displayprio>2</displayprio> <timescale>1day</timescale> <base1024>false</base1024> <graphdatapoints> <graphdatapoint> <name>InMax</name> <datapointname>InOctets</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>OutMax</name> <datapointname>OutOctets</datapointname> <cf>2</cf> </graphdatapoint> <graphdatapoint> <name>TotalMax</name> <datapointname>octets</datapointname> <cf>2</cf> </graphdatapoint> </graphdatapoints> <graphvirtualdatapoints> <graphvirtualdatapoint> <name>InMaxBits</name> <rpn>InMax*8</rpn> </graphvirtualdatapoint> <graphvirtualdatapoint> <name>OutMaxBits</name> <rpn>OutMax*8</rpn> </graphvirtualdatapoint> <graphvirtualdatapoint> <name>TotalMaxBits</name> <rpn>TotalMax*8</rpn> </graphvirtualdatapoint> </graphvirtualdatapoints> <graphdatas> <graphdata> <type>1</type> <legend>In (max)</legend> <color>blue</color> <datapointname>InMaxBits</datapointname> <isvirtualdatapoint>true</isvirtualdatapoint> </graphdata> <graphdata> <type>1</type> <legend>Out (max)</legend> <color>green</color> <datapointname>OutMaxBits</datapointname> <isvirtualdatapoint>true</isvirtualdatapoint> </graphdata> <graphdata> <type>1</type> <legend>Total (max)</legend> <color>silver</color> <datapointname>TotalMaxBits</datapointname> <isvirtualdatapoint>true</isvirtualdatapoint> </graphdata> </graphdatas> </graph> </graphs> <overviewgraphs> <overviewgraph> <name>Top_10 interfaces by total bandwidth</name> <title>Top 10 interfaces by total bandwidth</title> <verticallabel>bps</verticallabel> <rigid>false</rigid> <maxvalue>NaN</maxvalue> <minvalue>0.0</minvalue> <displayprio>1</displayprio> <timescale>1day</timescale> <base1024>false</base1024> <aggregated>false</aggregated> <datapoints> <overviewgraphdatapoint> <name>InOctets</name> <datapointname>InOctets</datapointname> <cf>1</cf> <aggregateMethod>sum</aggregateMethod> </overviewgraphdatapoint> <overviewgraphdatapoint> <name>OutOctets</name> <datapointname>OutOctets</datapointname> <cf>1</cf> <aggregateMethod>sum</aggregateMethod> </overviewgraphdatapoint> </datapoints> <virtualdatapoints> <overviewgraphvirtualdatapoint> <name>bps</name> <rpn>(InOctets+OutOctets)*8</rpn> </overviewgraphvirtualdatapoint> </virtualdatapoints> <lines> <overviewgraphline> <type>1</type> <legend>##INSTANCE##</legend> <datapointname>bps</datapointname> <isvirtualdatapoint>true</isvirtualdatapoint> <color>silver</color> </overviewgraphline> </lines> </overviewgraph> <overviewgraph> <name>Top_10 interfaces by total drops</name> <title>Top 10 interfaces by total drops</title> <verticallabel>packets</verticallabel> <rigid>false</rigid> <maxvalue>NaN</maxvalue> <minvalue>0.0</minvalue> <displayprio>1</displayprio> <timescale>1day</timescale> <base1024>false</base1024> <aggregated>false</aggregated> <datapoints> <overviewgraphdatapoint> <name>indiscards</name> <datapointname>indiscards</datapointname> <cf>2</cf> <aggregateMethod>sum</aggregateMethod> </overviewgraphdatapoint> <overviewgraphdatapoint> <name>inerrors</name> <datapointname>inerrors</datapointname> <cf>2</cf> <aggregateMethod>sum</aggregateMethod> </overviewgraphdatapoint> <overviewgraphdatapoint> <name>outdiscards</name> <datapointname>outdiscards</datapointname> <cf>2</cf> <aggregateMethod>sum</aggregateMethod> </overviewgraphdatapoint> <overviewgraphdatapoint> <name>outerrors</name> <datapointname>outerrors</datapointname> <cf>2</cf> <aggregateMethod>sum</aggregateMethod> </overviewgraphdatapoint> </datapoints> <virtualdatapoints> <overviewgraphvirtualdatapoint> <name>drops</name> <rpn>inerrors+indiscards+outerrors+outdiscards</rpn> </overviewgraphvirtualdatapoint> </virtualdatapoints> <lines> <overviewgraphline> <type>1</type> <legend>##INSTANCE##</legend> <datapointname>drops</datapointname> <isvirtualdatapoint>true</isvirtualdatapoint> <color>silver</color> </overviewgraphline> </lines> </overviewgraph> </overviewgraphs> <scripts> </scripts> </entry> </feed> Quote Share this post Link to post Share on other sites
0 Tom Lasswell 21 Report post Posted March 28, 2017 This is going to be a long road I believe. You're going to want to start with just trying to pull API data from the controllers. I'd start with health scores and go from there. We're going to start building some very soon, as I get them done (likely in the next few months) I'll publish to the exchange. Quote Share this post Link to post Share on other sites
0 Brent Reeves 0 Report post Posted July 16, 2018 On 3/27/2017 at 9:52 PM, Tom Lasswell said: This is going to be a long road I believe. You're going to want to start with just trying to pull API data from the controllers. I'd start with health scores and go from there. We're going to start building some very soon, as I get them done (likely in the next few months) I'll publish to the exchange. Tom, have you built the LogicModules for ACI? I was searching for information and came across your post from 2017. Quote Share this post Link to post Share on other sites
Does anyone have any experienced with monitoring a Cisco ACI environment? Any good documentation that I can reference?
Thanks,
Share this post
Link to post
Share on other sites