blob: 2de73c58b14d0674baf9ac2fef0f7f8e9a806385 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
using System;
using System.Linq;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;
using Microsoft.EnterpriseManagement.HealthService;
using Microsoft.EnterpriseManagement.Mom.Modules.DataItems;
using Microsoft.EnterpriseManagement.Mom.Modules.DataItems.Performance;
namespace Ambari.SCOM.Modules {
[MonitoringModule(ModuleType.Condition), ModuleOutput(true)]
public class PropertyBagMultiplePerformanceDataMapper : ModuleBase<MOMPerfDataItem> {
private readonly object shutdownLock;
private bool shutdown;
private PropertyBagMultiplePerformanceDataMapperConfiguration config;
public PropertyBagMultiplePerformanceDataMapper(ModuleHost<MOMPerfDataItem> moduleHost, XmlReader configuration, byte[] previousState)
: base(moduleHost) {
if (moduleHost == null)
throw new ArgumentNullException("moduleHost");
if (configuration == null)
throw new ArgumentNullException("configuration");
if (previousState != null) {
// Since this module never calls SaveState this value should be null.
throw new ArgumentOutOfRangeException("previousState");
}
shutdownLock = new object();
LoadConfiguration(configuration);
}
private void LoadConfiguration(XmlReader configuration) {
try {
config = (PropertyBagMultiplePerformanceDataMapperConfiguration)new XmlSerializer(typeof(PropertyBagMultiplePerformanceDataMapperConfiguration)).Deserialize(configuration);
} catch (InvalidOperationException xe) {
throw new ModuleException("Invalid module configuration.", xe);
}
}
[InputStream(0)]
public void OnNewDataItems(DataItemBase[] dataItems, bool logicalSet,
DataItemAcknowledgementCallback acknowledgedCallback, object acknowledgedState,
DataItemProcessingCompleteCallback completionCallback, object completionState) {
// Either both delegates are null or neither should be.
if ((acknowledgedCallback == null && completionCallback != null) ||
(acknowledgedCallback != null && completionCallback == null)) {
throw new ArgumentOutOfRangeException("acknowledgedCallback, completionCallback");
}
var ackNeeded = acknowledgedCallback != null;
lock (shutdownLock) {
if (shutdown) return;
var outputDataItems = new List<MOMPerfDataItem>();
var timeStamp = DateTime.UtcNow;
foreach (var dataItem in dataItems) {
var bag = dataItem is PropertyBagDataItem ? (PropertyBagDataItem)dataItem
: new PropertyBagDataItem(dataItem.GetItemXml());
foreach (var collection in bag.Collections) {
foreach (var record in collection.Value) {
double value;
if (record.Value == null ||
!double.TryParse(record.Value.ToString(), out value)) continue;
var mapping = config.Mappings.FirstOrDefault(m => m.PropertyName.Equals(record.Key, StringComparison.InvariantCultureIgnoreCase));
if (mapping == null) continue;
var perfDataItem = new MOMPerfDataItem(
timeStamp,
mapping.ObjectName, mapping.CounterName, mapping.InstanceName,
false, value,
config.ManagedEntityId, config.RuleId);
outputDataItems.Add(perfDataItem);
}
}
}
// Handle output
if (outputDataItems == null || outputDataItems.Count == 0) return;
if (ackNeeded) {
DataItemAcknowledgementCallback ackDelegate = delegate(object ackState) {
lock (shutdownLock) {
if (shutdown) return;
acknowledgedCallback(acknowledgedState);
completionCallback(completionState);
ModuleHost.RequestNextDataItem();
}
};
ModuleHost.PostOutputDataItems(outputDataItems.ToArray(), true/*logicalSet*/, ackDelegate, null);
} else {
ModuleHost.PostOutputDataItems(outputDataItems.ToArray(), true/*logicalSet*/);
ModuleHost.RequestNextDataItem();
}
}
}
public override void Shutdown() {
lock (shutdownLock) {
shutdown = true;
}
}
public override void Start() {
lock (shutdownLock) {
if (shutdown) return;
ModuleHost.RequestNextDataItem();
}
}
}
}