Welcome to MSDN Blogs Sign in | Join | Help

Jakub@Work

Programming with System Center Service Manager and Operations Manager
Inserting Operational Data

I received a few requests to talk about operational data insertion in SCOM 2007. I was a bit hesitant to take this on now, mostly because I haven't really covered a lot of the core concepts required to truly understand the data insertion process, but I decided that people can ask clarifying questions if they have any while getting this out there was an important step in helping customers and partners move from 2005 to 2007.

There are two objects that are used for inserting operational data; CustomMonitoringEvent and CustomMonitoringPerformanceData. Inserting these objects is supported both via the SDK directly as well as the MCF web-service.

This data can be inserted against any discovered object (unlike MOM 2005 where only programmatically inserted computers were supported for event/performance data insertion in the SDK) via the InsertCustomMonitoringEvent(s) and InsertCustomMonitoringPerformanceData methods on the PartialMonitoringObject class as well as the InsertMonitoringEvents and InsertMonitoringPerformanceData methods on the MCF endpoint.

The below sample illustrates finding all computers in the management group and inserting a single performance data value against each:

using System;

using System.Collections.ObjectModel;

using Microsoft.EnterpriseManagement;

using Microsoft.EnterpriseManagement.Configuration;

using Microsoft.EnterpriseManagement.Monitoring;

 

namespace Jakub_WorkSamples

{

    partial class Program

    {

        static void InsertCustomMonitoringPerformanceData()

        {

            // Connect to the sdk service on the local machine

            ManagementGroup localManagementGroup = new ManagementGroup("localhost");

 

            // Get the MonitoringClass representing a Computer

            MonitoringClass computerClass =

                localManagementGroup.GetMonitoringClass(SystemMonitoringClass.Computer);

 

            // Use the class to retrieve partial monitoring objects

            ReadOnlyCollection<PartialMonitoringObject> computerObjects =

                localManagementGroup.GetPartialMonitoringObjects(computerClass);

 

            // Loop through each computer

            foreach (PartialMonitoringObject computer in computerObjects)

            {

                // Create a CustomMonitoringPerformanceData object

                CustomMonitoringPerformanceData perfData =

                    new CustomMonitoringPerformanceData("CPU", "CPU Threshold", 21.3);

                perfData.InstanceName = computer.Name;

 

                // Insert the data

                computer.InsertCustomMonitoringPerformanceData(perfData);

            }

        }

    }

}

The pattern for events is very similar, there are just more properties available on CustomMonitoringEvent.

In order to actually use these objects and methods, it's important to understand what happens when any of the insert calls complete. First, these objects get converted to their runtime counterpart as xml; for events this is the System.Event.LinkedData* as defined in the System.Library* management pack and for performance data this is System.Performance.LinkedData* as defined in the System.Performance.Library* management pack. These items are then inserted into the PendingSdkDataSource table in the database. Once this happens, the call succeeds and returns, even though the data has not yet been processed.

In order to actually pick up and utilize the inserted data, I also wrote several DataSourceModuleTypes (this is a management pack level concept that describes data sources (providers in MOM 2005) that are available for use in rules and monitors) that read from the PendingSdkDataSource table in the db and process the newly inserted objects. "Normal" performance data and event rules use the system defined DataSourceModuleTypes that read the system performance counters and the event log, respectively. The data inserted via the SDK will not be processed if using these data sources. All the data sources that facilitate SDK insertion are on a fixed polling interval of 30 seconds, and wake up that often to process any new data in the database. There are two DataSourceModuleTypes available for both events and performance data, all defined in the Microsoft.SystemCenter.Library*:

Microsoft.SystemCenter.SdkEventProvider - This data source will output a System.Event.LinkedData object for every CustomMonitoringEvent inserted via the SDK, regardless of the object it was inserted against.

Microsoft.SystemCenter.TargetEntitySdkEventProvider - This data source will only output a System.Event.LinkedData object for CustomMonitoringEvents inserted via the SDK that were inserted against the target of the workflow that is using the DataSourceModuleType. For instance, if you create a new rule and target it to the System.Computer type and use this DataSourceModuleType as the data source of the rule, the only events that will come out of the data source will be events that were inserted against objects of the System.Computer class.

Microsoft.SystemCenter.SdkPerformanceDataProvider - The same as the SdkEventProvider, only for System.Performance.LinkedData and CustomMonitoringPerformanceData.

Microsoft.SystemCenter.TargetEntitySdkPerformanceDataProvider - The same as the TargetEntitySdkEventProvider, only for System.Performance.LinkedData and CustomMonitoringPerformanceData.

So, in order to actually drive state of discovered objects, or perform other actions based on the data inserted via the SDK, you will need to write rules or monitors that use the aforementioned DataSourceModuleTypes. We do ship and install by default in the Microsoft.SystemCenter.Internal* management pack two rules that automatically collect all the data inserted via the SDK; Microsoft.SystemCenter.CollectSdkEventData* and Microsoft.SystemCenter.CollectSdkPerformanceData*. These rules are both targeted at the RootManagementServer* class and will only be instantiated, as such, on the Principal Management Server.

One very important thing to note: if you write rules or monitors that use the sdk data sources, they must be executed on a server that has database access AND the account the rule or monitor is running under must have the required database permissions. In general a rule or monitor is executed on the machine that discovered the object of a particular class; i.e. if you discover an instance of SQL Server on computer A and computer A has an agent on it, all rules and monitors targeted to SQL Server will be run on that particular SQL Server objects behalf on the agent on computer A. That's a bit of a mouthful, but I hope it makes sense.

* These names are subject to change prior to RTM.

Posted: Tuesday, September 05, 2006 9:06 PM by JakubOleksy

Comments

romaric said:

Is it possible to provide some more documentation and/or sample how to create a monitor based on this SDKEvent ?
# September 8, 2006 5:02 AM

JakubOleksy said:

Absolutely. For my next post I will go over using the data sources I described here in a managemment pack.

To get you started though, you can check out the monitor types as defined in the Microsoft.Windows.Library management pack. If you look at the Microsoft.Windows.SingleEventLogManualReset2StateMonitorType, you will notice that it is compromised of an event data source followed by an expression filter. You would use the SDK event data source in much the same way, creating a monitor type that uses it, then creating monitors that use that monitor type.

Again, the big thing to note here is that the SDK event data source will produce events already attributed to monitoring objects, regardless of the target of the monitor or rule of which it is a part. Thus, targeting for monitors and rules using this data source would almost always be against the Prinicpal Management Server, unless they were targeted against a custom user-defined class that is always discovered and managed by the Principal Management Server, in which case targeting the monitor or rule to that class will have the same affect and you can utilize the Microsoft.SystemCenter.TargetEntitySdkEventProvider.
# September 8, 2006 12:15 PM

Sureshquest said:

Is it possible to override the date/time at which the performance data is received? And is it possible to get multiple performance counters from single rule? or do i need to write seperate rules for each performance counter? The example i'm testing is using a Windows.TimedScript.PerformanceProvider, my performance data will be periodically populated into a file. So i need to check the file and load the data in SCOM. So every time i need to bulk load many performance counters and to be accurate i need to follow the date/time provided in the file.

# November 21, 2006 6:05 AM

JakubOleksy said:

As long as your data source can read multiple counters, your rule should be able to write them to the database. It looks like with this data source you cannot do multiple counters nor can you set the time.

You can use the SDK to accomplish this by reading from the file then inserting the data via MonitoringObject.InsertCustomMonitoringPerformanceData(). There you can set the time generated for the performance data.

# November 21, 2006 2:34 PM

Sureshquest said:

Is it possible to write custom "data sources" or "data providers" using the SDK and use that data source from the Rules?

# November 21, 2006 10:04 PM

JakubOleksy said:

The only public way this is supported is through scripts. We don't have any resources available to help partners build managed code modules at this time.

# November 27, 2006 5:37 PM

Ashwath Akirekadu said:

Can you point me to the place where I find official or non-official documentation on 'things' such as SdkPerformanceDataProvider, Microsoft.Windows.Library, etc?

I am able to figure out some of the things by going over the cool examples provided here.  However often I run into things that are not used in any of the examples.

Right now I am trying to figure out what configurable properties available in SdkPerformanceDataProvider data source.

# February 12, 2008 4:08 PM

JakubOleksy said:

There is no single place where you can find documentation like this; some things are not documented at all, like the SdkPerformanceDataProvider for instance. For that specifically, you should open the MP it's defined in using your favorite xml editor or the authoring console and take a look that way.

# February 12, 2008 4:15 PM

Ashwath Akirekadu said:

Found it.  Thanks!

Lack of documentation is not much of problem because you provide unbelievably quick response on the blog.  This is going to be the first place to look!

# February 12, 2008 5:24 PM

VincentdeVries said:

I'm trying to insert some performance data for a MP I created using MonitoringObject.InsertCustomMonitoringPerformanceData().

If I now make a rule with Microsoft.SystemCenter.TargetEntitySdkPerformanceDataProvider as DataSource, what module would I have to use as write action?

# January 20, 2009 6:08 PM

JakubOleksy said:

If you just want to insert, we ship a rule OOB that already does this.  Are you trying to do something special?

# January 20, 2009 6:38 PM

VincentdeVries said:

Don't think I'm doing anything special. I made a custom class. By using the  SDK I inserted a few instances with my own connector. Now by using InsertCustomMonitoringPerformanceData()I inserted some performance data against those instances. When I open the PendingSdkDataSource table I can see the inserted data, but it never seems to be inserted into the database as performance data.

Reading your article I would guess I have to use TargetEntitySdkPerformanceDataProvider as data source in a rule, but I am not sure how to create the rest of the rule.

# January 21, 2009 4:34 AM

JakubOleksy said:

This is the rule that ships in the Microsoft.SystemCenter.2007 MP for perf counter collection from SDK:

<Rule ID="Microsoft.SystemCenter.CollectSdkPerformanceData" Comment="this rule collects all performance data from the sdk" Enabled="true" Target="SCLibrary!Microsoft.SystemCenter.RootManagementServer" ConfirmDelivery="true" Remotable="true" Priority="Normal" DiscardLevel="100">

       <Category>PerformanceCollection</Category>

       <DataSources>

         <DataSource ID="DS" TypeID="SCLibrary!Microsoft.SystemCenter.SdkPerformanceDataProvider" />

       </DataSources>

       <WriteActions>

         <WriteAction ID="WriteToDB" TypeID="SCLibrary!Microsoft.SystemCenter.CollectPerformanceData" />

       </WriteActions>

     </Rule>

# January 21, 2009 11:52 AM

VincentdeVries said:

Thanks for your help Jakub, that works very well!

# January 21, 2009 3:29 PM

VincentdeVries said:

Hi Jakub,

Is it correct that performace data in the past doesn't get inserted? For example

perfData.TimeSampled = DateTime.Now.AddSeconds(-(double)30);

doesn't seem to be inserted.

# February 7, 2009 7:02 PM

VincentdeVries said:

I figured it out. It's possible to insert perf data in the past, jus not before any other data sampled.

# February 8, 2009 5:13 AM

dstaviss said:

Please clarify it for me - I insert the data using InsertCustomMonitoringPerformanceData and the OOB CollectSdkPerformanceData rule is enabled. I can see the performance metrics in the console. However when I define the monitors (Unit Monitors) to trigger the state changes etc - these stay grayed-out - I assume the reason is that the metrics are not actually inserted...right? So what do I need to do to be able to use the counters in the Unit Monitors?

Thanks,

David

# March 30, 2009 7:17 PM

JakubOleksy said:

Did you create the monitor with the SDK data source as in the sample?

# March 30, 2009 7:27 PM

dstaviss said:

No, and I guess this is the problem... and I dont see any attachments in this post, could you post a link to the sample? thx

# March 30, 2009 8:22 PM

dstaviss said:

I think I found the example ... I implemented the datasource/monitortype according to it (imported MP ok) but still getting the monitors grayed out.

I had to guess the element names of the SDK Performance Counter so this might be the reason... could you look at the code fragment below - if anything stands out? Also is there a way to debug this?

Thx

   <MonitorTypes>

      <UnitMonitorType ID="CCMSMetricMonitorType" Accessibility="Public">

         <MonitorTypeStates>

            <MonitorTypeState ID="SDKMetricUnderThreshold" />

            <MonitorTypeState ID="SDKMetricOverThreshold" />

         </MonitorTypeStates>

         <Configuration>

           <xsd:element name="CounterName"  type="xsd:string"  minOccurs="1" maxOccurs="1" />

           <xsd:element name="ObjectName"   type="xsd:string"  minOccurs="1" maxOccurs="1" />

           <xsd:element name="Frequency"    type="xsd:int"     minOccurs="1" maxOccurs="1" />

           <xsd:element name="Threshold"    type="xsd:double"  minOccurs="1" maxOccurs="1" />

         </Configuration>

         <MonitorImplementation>

           <MemberModules>

            <DataSource ID="DS" TypeID="SC!Microsoft.SystemCenter.SdkPerformanceDataProvider" />

               <ConditionDetection TypeID="System!System.ExpressionFilter" ID="CDSDKMetricOver">

                 <Expression>

                   <And>

                     <Expression>

                       <SimpleExpression>

                          <ValueExpression>

                             <XPathQuery>ObjectName</XPathQuery>

                          </ValueExpression>

                          <Operator>Equal</Operator>

                         <ValueExpression>

                           <Value>$Config/ObjectName$</Value>

                         </ValueExpression>

                       </SimpleExpression>

                     </Expression>

                     <Expression>

                       <SimpleExpression>

                         <ValueExpression>

                           <XPathQuery>CounterName</XPathQuery>

                         </ValueExpression>

                         <Operator>Equal</Operator>

                         <ValueExpression>

                           <Value>$Config/CounterName$</Value>

                         </ValueExpression>

                       </SimpleExpression>

                     </Expression>

                     <Expression>

                       <SimpleExpression>

                         <ValueExpression>

                           <XPathQuery>Value</XPathQuery>

                         </ValueExpression>

                         <Operator>Greater</Operator>

                         <ValueExpression>

                           <Value>$Config/Threshold$</Value>

                         </ValueExpression>

                       </SimpleExpression>

                     </Expression>

                   </And>

                </Expression>

             </ConditionDetection>

             <ConditionDetection TypeID="System!System.ExpressionFilter" ID="CDSDKMetricUnder">

               <Expression>

                 <And>

                   <Expression>

                     <SimpleExpression>

                       <ValueExpression>

                         <XPathQuery>ObjectName</XPathQuery>

                       </ValueExpression>

                       <Operator>Equal</Operator>

                       <ValueExpression>

                         <Value>$Config/ObjectName$</Value>

                       </ValueExpression>

                     </SimpleExpression>

                   </Expression>

                   <Expression>

                     <SimpleExpression>

                       <ValueExpression>

                         <XPathQuery>CounterName</XPathQuery>

                       </ValueExpression>

                       <Operator>Equal</Operator>

                       <ValueExpression>

                         <Value>$Config/CounterName$</Value>

                       </ValueExpression>

                     </SimpleExpression>

                   </Expression>

                   <Expression>

                     <SimpleExpression>

                       <ValueExpression>

                         <XPathQuery>Value</XPathQuery>

                       </ValueExpression>

                       <Operator>LessEqual</Operator>

                       <ValueExpression>

                         <Value>$Config/Threshold$</Value>

                       </ValueExpression>

                     </SimpleExpression>

                   </Expression>

                 </And>

               </Expression>

             </ConditionDetection>

           </MemberModules>

           <RegularDetections>

             <RegularDetection MonitorTypeStateID="SDKMetricOverThreshold">

               <Node ID="CDSDKMetricOver">

               <Node ID="DS" />

             </Node>

           </RegularDetection>

            <RegularDetection MonitorTypeStateID="SDKMetricUnderThreshold">

              <Node ID="CDSDKMetricUnder">

               <Node ID="DS" />

             </Node>

           </RegularDetection>

         </RegularDetections>

       </MonitorImplementation>

     </UnitMonitorType>

  </MonitorTypes>

 </TypeDefinitions>

 <Monitoring>

   <Monitors>

     <UnitMonitor ID="SystemAvailabilityMonitor" Accessibility="Public" Enabled="true" Target="SAPSystem" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="CCMSMetricMonitorType" ConfirmDelivery="true">

       <Category>Custom</Category>

       <OperationalStates>

         <OperationalState ID="SystemAvailabilityMonitor.Under" MonitorTypeStateID="SDKMetricUnderThreshold" HealthState="Warning" />

         <OperationalState ID="SystemAvailabilityMonitor.Over" MonitorTypeStateID="SDKMetricOverThreshold" HealthState="Success" />

       </OperationalStates>

       <Configuration>

         <CounterName>RFCConnect</CounterName>

         <ObjectName>Availability</ObjectName>

         <Frequency>300</Frequency>

         <Threshold>0.99</Threshold>

       </Configuration>

     </UnitMonitor>

     <UnitMonitor ID="AppServerAvailabilityMonitor" Accessibility="Public" Enabled="true" Target="AppServer" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="CCMSMetricMonitorType" ConfirmDelivery="true">

       <Category>Operations</Category>

       <OperationalStates>

         <OperationalState ID="AppServerAvailabilityMonitor.Under" MonitorTypeStateID="SDKMetricUnderThreshold" HealthState="Warning" />

         <OperationalState ID="AppServerAvailabilityMonitor.Over" MonitorTypeStateID="SDKMetricOverThreshold" HealthState="Success" />

       </OperationalStates>

       <Configuration>

         <CounterName>Value</CounterName>

         <ObjectName>Availability</ObjectName>

         <Frequency>300</Frequency>

         <Threshold>0.99</Threshold>

       </Configuration>

     </UnitMonitor>

     <UnitMonitor ID="AppServerCPUMonitor" Accessibility="Public" Enabled="true" Target="AppServer" ParentMonitorID="Health!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="CCMSMetricMonitorType" ConfirmDelivery="true">

       <Category>Operations</Category>

       <OperationalStates>

         <OperationalState ID="AppServerCPUMonitor.Under" MonitorTypeStateID="SDKMetricUnderThreshold" HealthState="Success" />

         <OperationalState ID="AppServerCPUMonitor.Over" MonitorTypeStateID="SDKMetricOverThreshold" HealthState="Error" />

       </OperationalStates>

       <Configuration>

         <CounterName>CPU_Utilization</CounterName>

         <ObjectName>CPU</ObjectName>

         <Frequency>900</Frequency>

         <Threshold>95</Threshold>

       </Configuration>

     </UnitMonitor>

   </Monitors>

 </Monitoring>

# March 31, 2009 12:38 AM

dstaviss said:

yes - I based my attempt on it. Several things are not clear to me yet:

1) Is it sufficient to define the MonitorType and a Monitor? Or an additional rule has to there there to trigger it?

2) What is the XML structure of the Performance Counter as produced by Microsoft.SystemCenter.SdkPerformanceDataProvider?

3) Is it possible to take a peek at the implementation of System.Performance.ThresholdMonitorType?

Thx

# March 31, 2009 11:45 AM

JakubOleksy said:

1) Yes, it should be enough.

2) It is the same as all performance data.

3) Not that I know of.

The best I could offer is a strategy on how to debug this, namely making the most simple monitor you can do, maybe without a condition detection even, and making sure it is all running properly. You can also use the tasks to see running and failed workflows and make sure your monitor is running on the RMS.

# March 31, 2009 11:56 AM

dstaviss said:

Thx, appreciate your help! One last (hopefully) question - for the 2) - where can I find the structure for the Performance Data XML?

# March 31, 2009 12:36 PM

JakubOleksy said:

I don't know honestly, but one way you could get it is look at the Context field of an alert generated from performance data.

# March 31, 2009 12:42 PM

dstaviss said:

Found it. FYI here it is:

< DataItem type =" MOM.MOMNTPerfData " time =" 2009-03-31T10:52:48.0468750-07:00 " sourceHealthServiceId =" A198AC0B-4420-BCFF-0AF0-44F155E45288 " >

 < ObjectName > Availability </ ObjectName >

 < CounterName > RFCConnect </ CounterName >

 < InstanceName />

 < IsNull Type =" Boolean " > false </ IsNull >

 < Value > 1 </ Value >

 < ManagedEntityId > {E0D05B9E-9A6C-1192-9E97-CC2EE2DF364D} </ ManagedEntityId >

 < RuleId > {47047E61-0565-BCC8-D47C-9A889FFF06FE} </ RuleId >

 </ DataItem >

# March 31, 2009 2:22 PM

idflyfish said:

Hello,

Thanks for the example.

I am having an issue when inserting multiple events targeted at the same monitoring object. These are seperate and distinct events with data read from a log file.

If I insert these events without pausing I get the correct number of events in OpsMgr but all with the same event message. However, if I pause after each insertion I get the proper number of events in OpsMgr and with the proper event message.

I have double checked my code and it seems correct. Any ideas?

# May 28, 2009 11:21 AM

JakubOleksy said:

Can you elaborate on what you mean by pausing? Do you have a code sample you could share?

# May 28, 2009 11:59 AM

idflyfish said:

Certainly,

What I mean is this. If I run my app which reads a log file and then inserts events based on data in that log file I get the weird behavior of the same description for each event. If I put a break point at the end of the method I use to insert the event into opsmgr and then wait for the event to show up in opsmgr it is correct.

I just looked at the PendingSdkDataSource table and I see the correct events. Are the records in this table supposed to be processed and then removed from the table?

# May 28, 2009 12:41 PM

JakubOleksy said:

The records are groomed later. If yo look at the resulting events in the DB, are they wrong too. That is very strange behavior that I have never seen before and doesn't reproduce for me.

# May 28, 2009 2:41 PM

idflyfish said:

Jakub,

The events in PendingSdkDataSource are correct, however I didn't look at every single one.

The events showing in the OpsMgr console are incorrect.

I am going to create a simple console app that can be used to demonstrate this behavior. If it does I will post it. Thanks for your help.

# May 28, 2009 2:59 PM

idflyfish said:

Jakub,

I was able to reproduce with the following code.

using System;

using System.Collections.Generic;

using System.Collections.ObjectModel;

using System.Linq;

using System.Text;

using System.IO;

using Microsoft.EnterpriseManagement;

using Microsoft.EnterpriseManagement.Administration;

using Microsoft.EnterpriseManagement.Common;

using Microsoft.EnterpriseManagement.Configuration;

using Microsoft.EnterpriseManagement.Monitoring;

namespace OpsMgrEventInsert

{

   class OpsMgrEventInsert

   {

       private static ManagementGroup mgmtGroup;

       private static CustomMonitoringEvent custMonEvent;

       static void Main(string[] args)

       {

           mgmtGroup = new ManagementGroup("<insert your rms here>");

           custMonEvent = new CustomMonitoringEvent("MySource", 999);

           custMonEvent.Channel = "Application";

           custMonEvent.LoggingComputer = "<insert your logging computer>";

           custMonEvent.User = "<insert your user>";

           custMonEvent.LevelId = 1;

           string classQuery = "Name = 'Microsoft.Windows.Computer'";

           MonitoringClassCriteria computerClassCriteria = new MonitoringClassCriteria(classQuery);

           ReadOnlyCollection<MonitoringClass> monitoringClasses = mgmtGroup.GetMonitoringClasses(computerClassCriteria);

           if (monitoringClasses.Count != 1)

           {

               throw new InvalidOperationException("Expected one monitoring object");

           }

           string objectQuery = "NetbiosComputerName = '<insert NetbiosComputerName here>'";

           MonitoringObjectCriteria objectCriteria = new MonitoringObjectCriteria(objectQuery, monitoringClasses[0]);

           ReadOnlyCollection<MonitoringObject> monitoringObjects = mgmtGroup.GetMonitoringObjects(objectCriteria);

           if (monitoringObjects.Count != 1)

           {

               throw new InvalidOperationException("Expected one monitoring object");

           }

           string logPath = @"<insert path to log file here. One entry per line>";

           using (StreamReader reader = new StreamReader(new FileStream(logPath,

                    FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))

           {

               string line = "";

               while ((line = reader.ReadLine()) != null)

               {

                   custMonEvent.Message = new CustomMonitoringEventMessage(line);

                   monitoringObjects[0].InsertCustomMonitoringEvent(custMonEvent);

               }

           }

       }

   }

}

# May 28, 2009 3:51 PM

JakubOleksy said:

So you're saying that when you run that code, all the events have the same message, but if you put a Thread.Sleep() after the insert, all is well?

# May 28, 2009 8:28 PM

idflyfish said:

When I run that code all of the event messages are correct in PendingSdkDataSource however they are never removed (Are the supposed to be after they are processed?). But in the Operations Manager Console the events all have the same message. Since PendingSdkDataSource is the first stop for the events and they are correc there maybe the CollectSDKEventData module doesn't like something about the events?

I didn't use Thread.Sleep(), I just manually "paused" it using a break point so I could verify state. However, I am sure Thread.Sleep() would work.

# May 29, 2009 11:02 AM

JakubOleksy said:

Seems really fishy. What makes it into the PendingSdkDataSource table is what gets converted into alerts, and pausing or not pausing doesn't change that (as you have described), so I am guessing there is some sort of bug or misunderstanding in what you are looking at.

# May 29, 2009 4:00 PM

idflyfish said:

It doesn't make sense to me either. Is there anything wrong with my example code? Were you able to run my example code to see if you get the same behavior?

# May 29, 2009 5:42 PM

idflyfish said:

Jakub,

Is there anything I can provide you or have you decided this isn't worth your time to look at?

# June 2, 2009 11:51 AM

JakubOleksy said:

Have you tried anything simpler, for instance two insert statements one after the other with manual data, no loops or reading from a file? Have you tried retreiving the events from the SDK and seeing that they are in fact incorrect?

# June 3, 2009 1:10 AM

idflyfish said:

I will try both of those. However, if I cannot read a file and submit events based on entries in the file this project is sunk. As far as the retreiving the events from the SDK, I figured they would show as incorrect since they show as incorrect in the Operations Manager console, but I will give it a shot anyway.

# June 3, 2009 11:00 AM

JakubOleksy said:

Yes, I am just trying to remove variable. When I do what I just asked you to do on R2, I see different event data for each.

# June 3, 2009 11:28 AM

PaulD said:

Jakub, who is responsible for PendingSdkDataSource records extraction and insertion into other tables?

We have latency problem with all our custom metrics.

Table contains 540000 records and continue increasing every minute.

SCOM 2007 SP1

# July 9, 2009 9:17 AM

PaulD said:

PendingSdkDataSource contains actual data but PerformanceDataAllView does not.

Lag between  PerformanceDataAllView and PendingSdkDataSource starts with 5-10 mins, then lag is increasing to 27 hours and continue increasing.

if we created custom rule and one of write actions is "write to DW".

what is intermediate table for DW db?

as we have the same problem for data in DW db.

# July 9, 2009 10:02 AM

JakubOleksy said:

There is a workflow that uses an special data source the reads from this table to do the insertion. This post discusses what the modules are that do this.

How much perf data are you inserting via the SDK? Keep in mind, this particular solution was never meant to support collecting a lot of data.  

# July 9, 2009 10:54 AM

PaulD said:

Jakub, thank you for promt responce.

We insert >1500 perf. metrics every 5 minutes.

Are there any way to speed up workflow?

Will moving OpsDB/RMS to more powerful HW help up?

Will more aggressive grooming of the table help us?

If yes, cna we change somehow internal SP p_PendingSdkDataSourceGrooming and Table PartitionAndGroomingSettings?

# July 10, 2009 2:11 AM

PaulD said:

and

will adding indexes to that table help up?

Could you kindly please shed some light on mentioned workflow logic.

# July 10, 2009 4:40 AM

PaulD said:

also we looked into SQL profiler,

is it true, that SdkPerformanceDataProvider pulling only 1000 rows per execution? How often this pulling is executed?

sorry for so many questions.

# July 10, 2009 8:57 AM

JakubOleksy said:

I'll have to get back to you on these on Monday, will have to dig up the code again. The 1k pull is either every 30 or 60 seconds. Grooming can be changed to be more aggressive, which would likely help. Indexes might help and better HW would likely help too.

# July 10, 2009 10:01 PM

PaulD said:

We dug further. According to sql trace log.

every 30 sec - pull next 1000 records where ObjectType = 0 (?events)

every 5 mins - pull next 1000 records where ObjectType = 1 (performance).

If it is correct, then our problem make sense.

As we feed table faster than internal workflow eats them.

Looks like we need patch from MS with ability to configure max row count to pull.

# July 11, 2009 3:03 PM

JakubOleksy said:

The polling interval for both events and performance data is 30 seconds, however, the module will wait until it receives an ACK for all outstanding data items. I am guesing performance data insertion is generally behind in your environment.

# July 11, 2009 5:37 PM

PaulD said:

in this case we have bottleneck in RMS or DB server performance. Jakub, thank you for support.

# July 12, 2009 3:46 PM

Tenchuu said:

Hi,

I managed to insert Custom Performance Data using from a CSV file with InsertCustomMonitoringPerformanceData().

However, at first I had a problem with the decimal fraction so the values were screwed up.

Now, when i fix that and reimport the values it doesn't update, therefore my question is: What does it do with the new values, relatively, how can I tell it to replace the old ones?

Basically I need to know how it reacts to imports of 2 different values at the same time for the same counter.

# August 18, 2009 4:40 AM

JakubOleksy said:

There isn't a way to update existing values and to answer your question, it will store both.

# August 18, 2009 3:17 PM
Anonymous comments are disabled
Page view tracker