Académique Documents
Professionnel Documents
Culture Documents
Foundation Guide
Legal Notices
Warranty
The only warranties for HP products and services are set forth in the express warranty statements
accompanying such products and services. Nothing herein should be construed as constituting an
additional warranty. HP shall not be liable for technical or editorial errors or omissions contained
herein.
Copyright Notice
Copyright 2012 Hewlett-Packard Development Company, L.P.
Trademark Notices
Oracle and Java are registered trademarks of Oracle and/or its affiliates, and shall not be used
without Oracles express written authorization. Other names may be trademarks of their respective
owners.
Intel and Itanium are registered trademarks of Intel Corporation in the US and other countries
and are used under license.
Red Hat and Enterprise Linux are registered trademarks of RedHat, Inc.
Documentation Updates
The title page of this document and the below print history contains the following identifying
information:
http://www.hp.com/support/usage
The following table lists the version history since the last released edition.
Print History
Edition Version Release Date
Related Documents
Refer to the following documents (including this document) for further information.
HP eIUM Release Provides release-specific topics, such as new features, software and hardware
Notes requirements, and known problems and workarounds.
HP eIUM Provides Operations Console usage information (also in help system embedded
Operations in the web application), such as an orientation to the interface, monitoring
Console User capabilities for the deployment, groups, and processes, as well as common
Guide usage scenarios.
HP eIUM Describes collector and Session Server templates pre-configured to read from
Template particular data sources. The templates can be used to create collectors and
Reference Session Servers quickly.
HP eIUM Real- Describes the Session Server, the Real-Time Charging Manager, and the Real-
Time Guide Time Engine in the eIUM system.
HP eIUM Studio Describes how to use the HP SNAP Studio to perform business, technical, or
User Guide administration tasks.
HP eIUM Real- Describes the Real-Time Engine system and functionality overview,
Time Developer development considerations, and reference information.
Guide
HP eIUM Real- Provides performance tuning and sizing tips and guidelines for the Real-Time
Time Engine.
Performance
Tuning and
Sizing Guide
HP eIUM Load Describes how to use the optional Load Balancer capabilities of eIUM.
Balancer Guide
HP eIUM SPR Introduces the Subscriber Profile Repository (SPR) and describes how to install
Guide and configure the SPR in eIUM.
Introduction to eIUM 22
eIUM Processes 23
Collector Hierarchy 26
Key Characteristics 26
Collector Components 28
What is a Collector? 30
Collector Components 30
Encapsulator Overview 31
Aggregator Overview 32
Aggregation Tree 32
Datastore Overview 33
Datastore Types 33
Database Tables 36
Configuring eIUM 44
Configuration and the eIUM Deployment Hierarchy 44
Configuration Attributes 49
Sample Configuration 50
Linked Collectors 53
Unlinked Collectors 53
Linked Collectors 54
Solution Architecture 62
Syntax 64
Example 64
Example 65
Error Scheme 66
Syntax 66
Example 66
Configuration Summary 67
Encapsulator Configurations 67
Aggregator Configurations 67
Datastore Configurations 68
Configuration Example 68
Configuration Example 71
Design Questions 75
DuplicateNMEDetectorRule 76
Recovery 76
Aging Mechanism 76
DuplicateCDRDetectorRule 76
Recovery 77
Aging Mechanism 77
TimeHashDuplicateCDRDetectorRule 77
Recovery 78
Aging Mechanism 78
TimeIntervalDuplicateCDRDetectorRule 78
Recovery 79
Aging Mechanism 79
Performance Comparison 80
Performance Statistics 81
Recovery 91
Collector Components 96
Configure Collectors 97
NMEAdapters 120
Encapsulators 121
Rules 122
Datastores 123
Namespaces 125
Syntax 126
Example 130
Example 131
Padding 153
<format> 157
<root> 158
<type> 158
<codec> 159
<sequence> 159
<choice> 159
<set> 160
<array> 160
<field> 161
<switch> 161
<raw> 162
<text> 163
<transformations> 199
<format> 199
<transformer> 200
<transform> 201
<script> 201
<chain> 202
<array> 202
<use-transformer> 202
<param> 203
<arg> 203
<schema> 249
<complexType> 250
<element> 251
<simpleType> 252
<annotation> 253
<appInfo> 253
<schema> 257
<complexType> 258
<element> 259
<simpleType> 260
Architecture 287
AuditAdornmentRule 312
Cautions 313
Overview
The HP Internet Usage Manager (eIUM) Software enables service providers to analyze the usage of
their infrastructure and bill customers accurately. It also provides service authorization and protocol
translation capabilities. This overall guide describes the architecture and operation of eIUM in
technical detail. This introductory topic introduces the key features of the product.
eIUM is one of the leading convergent mediation and usage management platforms for voice, IMS,
DSL, cable, VoIP, 3G mobile, WiFi/LAN and many other networks and technologies. eIUM is a real-
time, convergent and adaptable mediation platform that can help you mediate todays networks for
billing, monitor and manage quality of service and capacity, as well as prepare you for future IMS
networks.
For examples of eIUM in action, see the IUM Voice and Convergent Mediation Case Study and the
WiFi/WLAN Case Study - A Real-Time Prepaid Solution for Wireless HotSpot Services. Also see the
eIUM Administrators Guide and eIUMReal-time Guide.
Business Problem 20
Introduction to eIUM 22
eIUM Processes 23
Collector Hierarchy 26
Key Characteristics 26
Collector Components 28
Business Problem
The convergence of voice and data traffic and of wireline and wireless networks presents service
providers with difficult technical challenges along with attractive revenue opportunities. New access
technologies like broadband, fiber, and wireless are fueling growth in data and voice traffic, making
it harder for service providers to keep pace with their competitors. Because profits from basic
access provision are diminishing, service providers must offer value-added servicesfrom
messaging to video-conferencing and Virtual Private Networks (VPN) to Voice-over-IP (VoIP)in
order to stay competitive. The challenge for providers today goes well beyond the provision of
reliable bandwidth.
Video
Wireless
BSS / OSS
Audio
Cable
Internet
News
Fiber
Charts
DSL
Subscribers Services
Many providers are compelled to offer voice and data services in bundled packages with flexible
billing plans. But in order to offer such services, providers must combine components from several
different partners, suppliers, and internal systems. Moreover, they must be able to predict and
manage capacity, analyze subscriber behavior, and use this business intelligence to price their
services for maximum profitability. Most importantly, providers must be able to bill for different
classes of subscribers and servicesquickly, accurately, and in the format that customers want.
In the traditional voice world, the public switched telephone network (PSTN) connection generates a
call detail record (CDR), which includes information about the duration, origin, and destination of the
connection. Because the circuit-switched network keeps good records, traditional billing systems
work accurately and efficiently for voice services.
Data (IP) traffic presents a much more complex billing problem than voice traffic. A traditional billing
system provide little visibility into the actual use of IP networks. These systems cannot distinguish
between types of IP traffica video-conferencing application and basic email, for exampleand bill
for content and usage accordingly.
To reliably analyze and charge for IP services, providers must be able to collect a variety of usage
metrics such as megabytes of data transferred, number of messages sent or services used, or even
the actual monetary amounts involved in e-commerce transactions. They must then collate them
into manageable aggregates of information, correlate them with user information, and send the
output to a billing or other business support system. In short, providers need a platform that
mediates between the IP service infrastructure and business support systems.
To implement usage-based billing and management of IP-based services, service providers need to
overcome several challenges:
l In IP networks, there is no single device that records the details of a transaction. Because
network elements are not originally designed for measurement of IP traffic volume, collecting
usage data from several sources can be a difficult process.
l In IP networks, a single subscriber action can involve several network elements, each performing
a discrete operation. When a subscriber performs an actiondownloads a file, for examplethe
business support systems may need to represent it as a single customer usage record. The
service infrastructure, however, uses many heterogeneous elementsrouters, Web servers,
DNSto satisfy the users need. Although these network elements log their activities, they do
not typically identify the user. To create the customer usage record, the activities of several
network elements must be correlated with the subscriber identity.
l IP services generate huge volumes of usage records that can overload business support systems
unless the data is aggregated.
The HP Internet Usage Manager Software is a mediation platform that is specifically designed to
address these challenges. eIUM collects usage events from network elements and converts them
into information that operational and business support systems (OSS/BSS) can consume, whether
they perform retail or wholesale billing, fraud detection, traffic analysis, network planning, or churn
management.
eIUM provides a flexible, scalable platform for deploying the convergent mediation and usage
management solutions required to operate complex service provider infrastructures and maximize
service revenue. eIUMs flexibility enables it to easily complement existing infrastructure and
processes, improving investment returns and minimizing risk. eIUM mediation solutions can be
deployed for wireline and wireless networks to support voice and data services, and to support
prepaid and postpaid billing models.
Mobile service providers provide a wide variety of services, including the following voice and data
transmission services to their subscribers over GSM/GPRS and other networks:
Introduction to eIUM
HP Internet Usage Manager Software (eIUM) is a usage mediation and management platform for
wireline or wireless networks carrying voice or data services. eIUM employs a scalable, distributed
architecture to collect, aggregate, and correlate usage data from your service infrastructure and
present the data to your business support system for billing or analysis. eIUM can capture data from
all (OSI reference model) network layers.
eIUM also provides a Real-Time Charging Manager that supports prepaid services, hot billing, and
real-time charging by providing a real-time authorization and accounting request and response
mechanism. eIUM can be configured to receive authorization and accounting requests from
application servers and service control points, perform any needed conversion and processing on
the request, query other servers such as rating, user repository, and balance manager, determine if
the request can be granted using your business rules, and send the response back to the application
server or service control point, all in real time. For more information, see the eIUM Real-time Guide.
eIUM Processes
eIUM consists of several important processes:
eIUM Processes
Process Descrption
Collector The primary constituent of eIUM mediation, a collector is a Java process that can read,
normalize, filter, and aggregate usage events or session records according to specific
rules. The number of collectors in your deployment depends on the number and variety of
data sources in your infrastructure and on the amount and type of preprocessing your
business application needs.
Session Server The session server is the main component that implements the Real-Time Charging
Manager. The Charging Manager provides rule-based event processing that enables you to
rapidly create new prepaid and hot-billed services. It provides authorization and
accounting for individual or bundled service packages that span multiple service offerings
and charging methods.
The session server is essentially a container that holds one or more connectors, one or
more rule chains, and one or more session stores. You can configure as many session
servers as you need, typically at least one for each protocol. In a highly available
environment, you might have a second standby session server for each primary session
server. For more information, see the eIUMReal-Time Guide.
Configuration The configuration server maintains the configuration of every collector. It stores all of the
Server configuration information in a central configuration store. Collectors retrieve their
configuration from this configuration store when they start up. Applications that interact
with collectors query the configuration server to get a collector's CORBA address or IOR.
Administration Present on each host in the deployment as either a Windows service or a UNIX daemon,
Agent the admin agent is the first eIUM process to start. The admin agent then starts all other
eIUM processes on that host. It also communicates between the configuration server and
the collectors.
Database eIUM stores metadata and processed data in the MySQL embedded database. eIUM also
Engine allows you to configure a pre-existing database, such as Oracle, instead.
Operations The Operations Console is a web-based application designed for eIUM operators who need
Console to monitor and manage an eIUM deployment on a daily basis. Operators do not necessarily
need to configure a deployment or perform detailed operations, however, they need to
Process Descrption
know the status of all eIUM processes. In contrast to the LaunchPad, for an operator who
needs to monitor and manage an eIUM deployment on a day-to-day basis to ensure that
processes are running smoothly, the Operations Console is an ideal tool. Among its
capabilities, it can give you an at-a-glance, global view of the health of your eIUM
deployment, view and monitor all the eIUM processes, and see alarms and problems with
eIUM processes immediately. You can also use it to create process groups for easier
monitoring and management, create history graphs to show process activity over time,
and drill down to process events for troubleshooting. Operators can also perform routine
management operations, such as starting and stopping processes and groups, and
changing log levels. The Operations Console also provides role-based security to limit
operations capabilities for different users. For more information on the Operations
Console, see the eIUM Operations Console User Guide.
Correlator A special-purpose collector, a correlator reads usage data from usage collectors and
session data from session collectors. It then combines these two sets of data, matching
usage with users. For example, it may combine usage data from Cisco routers with session
data from RADIUS sessions to associate network usage with corresponding users.
Report A special-purpose collector, a report collector obtains processed data from other
Collector collectors and stores the reporting-related information in the database.
Web A web application executed by the Apache Tomcat servlet engine (from the Apache
Application Software Foundation) embedded in eIUM. The Web Application Server is a Java process
Server that supports the eIUM Operations Console, Reference Data Manager, eIUM Reporting and
eIUM Audit Reporting.
Schedule An optional process, the Schedule Server allows eIUM (or external scripts) to perform
Server specific operations at scheduled intervals.
Management A real-time central server effectively used as a container for the ManagementService and
Server PollingService. The ManagementServer is intended to serve as a back-end for all
managing clients, such as the Operations Console, Reference Data Manager, and Real-
Time Engine. The default management architecture implies a single ManagementServer
configured for a distributed eIUM deployment, but eIUMusers can also configure multiple
ManagementServers for higher availability. Integrating with Real-Time Engine product
extension, it can also monitor and manage applications built on the Real-Time Engine, and
other subsystems of the Real-Time Engine (for example, the eIUMrepository, and the
eIUM Load Balancer). The following figure shows the relationship between common
eIUMcomponents (to include the optional Real-Time Engine and some of its components,
such as HP SNAP Studio), and the management platform that the central management
server is at the core of.
Process Descrption
The central management server supports multiple active instances, and there is no
shared state between each instance. However, a master management server is
configured in the system. When the master server crashes, the managed server connects
to the secondary instance. When the master server is recovered, the managed server
connects to the master server. The central manager can be scalable by partitioning the
managed servers. The partition of each managed server is connected to a central
manager pair. In most the cases, there are two current instances to support high
availability, and there is no partition required if the quantity of managed servers is small.
The process quantity in most cases is two, but can be 2 * N (where N is the partition
quantity).
The central management server includes an execution profile, which is comprised of the
micro kernel, common services, and an enterprise service operation manager. Using JMX
or RMI, the central management server calls remote interfaces on the managed servers
to collect system state information, and invokes management interfaces on managed
servers. The Real-Time Engine's HP SNAP Studio application need only communicate with
the central management server to monitor the whole eIUM system. For more information
on the eIUM Real-Time Engine, SNAP Studio, and the Load Balancer, see their respective
user guides (eIUM Real-Time Guide, eIUM Studio User Guide, and eIUM Load Balancer Guide).
Repository A server used as a content repository where you can upload, check in, and check out files
Server so other eIUMprocesses can utilize them (for example, for use with the eIUMConsole,
Common Codec Framework/eIUMStudio, and Real-Time Engine product extension).
Studio Server A component of the Real-Time Engine, the Studio Server supports multiple active
instances for scalability, and there is no shared state between each instance. The HP SNAP
Studio server is linearly scalable, and each instance can work as the backup of others. In
most cases, there are two instances coexisted to support high-availability. Typically, there
Process Descrption
are two processes, but the process quantity can be increased to any number of processes.
The Studio Server includes an execution profile, which is comprised of the micro kernel,
tools, common services, and application data model library. The Studio Server is also part
of the Real-Time Engine (HP SNAP) Studio subsystem, which is the integrated web-based
graphical interface subsystem in the Real-Time Engine. It serves business users who need
to manage a product catalog, or technical users who want to use the advanced extension
capability in the software. An OMC (Operations and Maintenance Console) for the OA&M
function is also integrated in the Studio subsystem. HP SNAP Studio can be used to design
and mange real-time applications, and uses RMI to communicate with the eIUM Repository
Server to read and deploy business components. For more information, see the eIUM Real-
Time Guide and eIUM Studio User Guide.
Collector Hierarchy
In any deployment, there are collectors that read usage and session data directly from the network
elements. These leaf collectors perform the first level of processing close to the network and
service elements, which minimizes network impact and maximizes reliability. They capture and
aggregate the data they receive (or query) and hold it in memory until they have received all the
data available for a specified time interval. They then flush the data to the local disk.
Intermediate collectors request the aggregated data from leaf collectors and perform operations
on these records. Finally, terminal collectors may obtain data from the intermediate collectors and
send processed data to business support systems. The leaf, intermediate, and terminal collectors
together constitute a collector hierarchy.
Raw usage data is thus transformed as it moves up the collector hierarchy into information that
business and operational support systems can consume.
Key Characteristics
eIUM is a comprehensive IP mediation and usage management solution with open interfaces to a
wide range of applications and data sources. eIUM has several strategic advantages compared to
competitive products:
l Scalability. eIUM provides carrier-level scalability across multiple networks and multiple
geographical locations, and to millions of subscribers.
Many mediation platforms use a central relational data store. Although relational data stores
can handle inputs from multiple clients, bulk inserts or the addition of clients is a costly
operation that severely affects performance and scalability.
In contrast, each eIUM collector aggregates usage data in a compact tree data structure and
then stores it locally in its own data store. Because only the essential views of aggregated data
are moved up the collector hierarchy, network traffic is significantly less than that in centralized
architectures.
l Reliability. eIUM collectors run autonomously, so if one collector fails, others can continue to
gather and aggregate data. The collector's local data store allows usage data to persist and be
retrieved after a failed component has been recovered. eIUM can also be deployed on a high-
availability platform like MC/Serviceguard for HP-UX platforms or Marathon for Windows
platforms.
l Extensibility. System integrators and developers can easily extend eIUM functionality by creating
new encapsulators, parsers, rules, or application data stores by taking advantage of the
extensibility and reusability of eIUM's pure Java implementation. For example, you can quickly
develop a new encapsulator to read data from new file formats, data streams, network
equipment, or APIs, and plug the encapsulator into an existing collector.
l Manageability. eIUM allows you to distribute collectors throughout the infrastructure and yet
manage the deployment centrally. eIUM achieves this by having the distributed collectors obtain
configuration information from a central configuration server, which provides a complete view of
the deployment. Collectors retain a cached record of their configuration and employ a local
agent to manage local collectors.
Each collector supports a notification mechanism to execute a program, script, or operating
system command after completing a flush of data to the datastore.
eIUM provides a graphical user interface as well as command line utilities with which you can
administer, configure, and query eIUM components. eIUM is also integrated with HP OpenView,
allowing you to monitor and manage the entire mediation system from a central OpenView
console.
l Security. The eIUM security framework provides a robust authentication and authorization
environment based on industry standards to ensure security compliance. It allows you to
leverage your existing IT infrastructure by integrating with your enterprise wide security
infrastructure, your external authentication systems such as Kerberos, NIS, LDAP or NTLM. It
supports multiple authentication mechanisms and transport protocols transparently, as well as
supporting multiple profiles of transport layer security (TLS) combining authentication with
optional data encryption. eIUM security also captures all activity information for auditing
purposes, and brings flexibility to credentials management by delegating it to a mature and
standard authentication system. Security helps users to keep one secure set of credentials for
access to all applications, and allows eIUM to participate in a single sign-on processes and share
enterprise-wide identities with other systems.
l Flexibility. eIUM consists of general-purpose, configurable modules that can be easily adapted to
meet changing business requirements. For example, a single rule engine can run multiple,
parallel aggregation schemes to support the various needs of billing, marketing, and operations
management systems.
l Open Standards. eIUM is written in 100% Java and supports open industry standards such as
CORBA. It provides open, documented interfaces to allow equipment and application vendors to
input data into eIUM or export data out of it. Its plug-in architecture makes it easy for developers
to extend its functionality by adding new features or incorporating new equipment and
applications.
HP is a founding, charter member of the IPDR (Internet Protocol Data Record) industry forum,
which is working on standardizing the IP Data Record collection and presentation to various
applications.
Collector Components
This section describes what collectors are and the main components that comprise collectors. For
descriptions of collector templates provided with eIUM, see the eIUM Template Reference. For
complete details on all collector components, see the eIUM Component Reference.
l The encapsulator reads the input data and places the data into a Normalized Metered Event or
NME, the data record format used by all eIUM components.
l The aggregator processes the NME data.
l The datastore stores the NME data and formats it for use by other collectors or applications.
Collector
Aggregator
raw processed
usage business
Encapsulator
data data
Datastore
You can replace any component with another of the same type.
l Voice switches, such as those from Alcatel, Ericsson, Lucent, Nokia, Nortel and Siemens
l VoIP devices
l WLAN access point devices and service control points
l AAA servers that use protocols such as Diameter and RADIUS
l IP routers, such as Cisco Netflow
l Web server log files
l Proxy server log files
l SNMP and RMON MIBs
l Mobile voice and data traffic from GSM/GPRS or CDMA switches
What is a Collector?
This series of topics describes the components of a collector, the fundamental process in an eIUM
mediation system. For complete details on all eIUM components, see the eIUM Component Reference.
Collector Components 30
Encapsulator Overview 31
Aggregator Overview 32
Aggregation Tree 32
Datastore Overview 33
Datastore Types 33
Database Tables 36
Collector Components
This section describes what collectors are and the main components that comprise collectors. For
descriptions of predefined collector templates provided with eIUM, see the eIUM Template Reference.
For complete details on all collector components, see the eIUM Component Reference.
l The encapsulator reads the input data and places the data into a Normalized Metered Event or
NME, the data record format used by all eIUM components.
l The aggregator processes the NME data.
l The datastore stores the NME data and formats it for use by other collectors or applications.
Collector
Aggregator
raw processed
usage business
Encapsulator
data data
Datastore
Encapsulator Overview
The encapsulator component of a collector reads usage data from a network data source, for
example from a file, from a voice or data switch, from an application or from another collector. eIUM
includes many encapsulators, each encapsulator corresponding to a particular type of network data
source, session source, or other data source. Each of the preconfigured collector templates
available when you create a new collector uses one of the encapsulator components described in
the eIUM Component Reference.
All eIUM components use configuration attributes to define their behavior. The encapsulator and
parser configuration attributes define how Normalized Metered Events (NME) are generated and
populated with data from the input data. All configuration attributes are declared in the
configuration server in a hierarchical tree structure. The encapsulator must be configured at the
following location or node in the configuration tree:
/deployment/<hostname>/<collectorname>/Encapsulator
Some encapsulators do not need a parser, for example a collector that reads from another
collector. In this case, the parser configuration node does not need to exist. If the parser
configuration entry does exist, it must have the following path name:
/deployment/<hostname>/<collectorname>/Encapsulator/Parser
The FlushProcessor performs the actual flush, writing the NMEs from the aggregation tree to the
datastore. The FlushProcessor can execute a limited set of rules before it flushes each NME to the
datastore. For example, you could filter out NMEs from being written to the datastore using a
FilterRule.
FlushTesters are components that let you test each NME for certain conditions before flushing and
only flush those NMEs that meet the conditions.
For complete details on these components, see the eIUM Component Reference.
Aggregator Overview
Each Normalized Metered Event (NME) read by the encapsulator is passed to the aggregator, or rule
engine component. The aggregator implements your business logic, performing any of a wide
variety of possible operations on the NMEs and storing them in an aggregation tree in memory. How
the nodes or the branches of the tree are established depends on the particular match rules and
aggregation rules that you configure. The leaf nodes of each tree are typically aggregated NMEs
which are ready to be stored in the datastore.
The aggregator builds the tree in memory and periodically saves, or flushes, the aggregated NMEs
from the tree to the datastore. How frequently the aggregated NMEs are stored to the datastore
depends on the configurable FlushPolicy. When NMEs are stored, recovery information is also saved
in the datastore to provide for recovery in case the collector unexpectedly stops.
Aggregation Tree
The aggregation scheme is a set of rules that construct an aggregation tree from the inbound
NMEs. The match rules sort the NMEs according to fields in the NME and build the aggregation tree.
For example, rules can match on source IP address, destination IP address and destination port
number. For voice mediation, the rules might sort on MSISDN, IMSI, originating number and
destination number. A new node is added to the tree for every unique combination of these match
attributes.
The aggregation rule processes each NME and correlates NMEs, meaning combines data fields from
two different NMEs into one NME, or it aggregates NMEs, meaning it combines the same fields from
two NMEs into one. For example, the aggregation rule might keep a total of the number of bytes
transferred from the source IP address to the destination IP address. Or it might accumulate and
store the total duration a mobile phone subscriber is connected to the voice network. It also
typically stores the earliest start time and latest end time of all the data records.
Simple collectors consist of a single aggregation scheme that contains a single chain of rules. More
complex collectors can have two or more aggregation schemes. Correlators correlate, or combine,
session event records with usage event records. These are described below.
Each inbound NME is processed by each scheme sequentially. Each scheme receives the NME output
from the previous scheme. If a scheme modifies the NME, the following scheme receives the
modified NME.
An example of multiple schemes would be validating input records. The first scheme could check the
NME for valid values and mark the NME as valid or invalid. The second scheme could handle all of the
valid NMEs. The third scheme could handle all of the invalid NMEs.
l Aggregator Each collector has exactly one aggregator object. The configuration of this
aggregator names one or more aggregation schemes to be used.
l Aggregation Scheme Each aggregation scheme lists a sequence of rules that control how
incoming NMEs are sorted and processed and how the aggregation tree is assembled. Each
collector can have one or more aggregation schemes.
l Rules Aggregation rules are the building blocks for constructing an aggregation scheme. The
rules control how the aggregation tree is constructed, and how NMEs are manipulated and
stored as they pass through this tree.
Datastore Overview
Each collector has a datastore that contains the collectors NME data and other information.
Depending on the type of datastore, applications can query the NMEs in the datastore. The
datastore also saves recovery information to enable the collector to gracefully recover if it stops
unexpectedly.
l Provide persistent storage of all of the NMEs aggregated by the collector and to save the
collector's state information in case the collector stops unexpectedly. While the collector is
running, it periodically flushes (writes to the datastore) all of the NMEs in its aggregation trees in
memory. This periodic flush occurs at regular intervals, as defined by the FlushPolicy.
l Support queries from other collectors, the siuquery command, and external applications, such as
billing applications. These queries can obtain usage NMEs based on some query criteria.
Datastore Types
Two main datastore types are available: JDBCDatastore and FileJDBCDatastore. Other datastore
types are available, but they are specialized versions of one of these. The only difference between
the two main datastore models is that the FileJDBCDatastore uses files to store the NMEs in binary
format and the JDBCDatastore uses a database table. Using files to store NMEs provides a
significant performance increase in the NME storage and retrieval process. See the below table for
a description of each datastore type.
Both datastore types use the database to store two tables: the history table and the recovery table.
These tables are described in "Database Tables" (on page 36).
You can use more than one datastore in a collector by using a MuxDatastore. The MuxDatastore is
simply a container of two or more datastores. You specify which output NMEs go to each datastore.
Datastore Types
Datastore Description
JDBCDatastore This type stores all information in a database. NMEs and metadata related to
the stored NMEs (history table and recovery table) are both stored in a
database. A JDBC driver is used to store the data. eIUM uses the MySQL
database, if you have opted to use this product extension.
FileJDBCDatastore This type uses the underlying file system to store the actual NMEs. Metadata
related to these NMEs (history table and recovery table) is stored in the
database. When large volumes of NMEs are being stored, significant
performance advantages can be achieved with this datastore. The trade-off
is that arbitrary queries are not supported. Time range-based queries are
supported.
IDRJDBCDatastore This datastore is a variant of the FileJDBCDatastore that stores the NMEs in
IDR+ (Internet Data Record Plus) format in ASCII files. Five types of output are
supported, differing in the way the NME fields are delimited: by a character
(default is '|'), in HTML table format, in XML table format, in IPDR format and
by specifying a fixed width for each NME field. Use the IDRJDBCDatastore with
fixed width format when you want the collector to generate output in IDR
format.
When you store data in IDR+ format, the expectation is that you are producing
this format so that a non-eIUM application can process the NMEs. For
example, you may produce HTML so that you can easily read a set of NMEs or
you may produce comma-delimited output so that a spreadsheet can easily
import NMEs.
AccumulatingFile This is a special form of the FileJDBCDatastore. It can combine data over a
JDBCDatastore configured interval.
Datastore Description
table and how you want it to be populated. This differs from the basic
JDBCDatastore, which stores information to the database in a fixed format
that is convenient for eIUMs storing, aging and querying tasks, but is not
intended for direct query.
Like IDR+ datastores, this datastore does not support queries through eIUM.
ApplicationJDBC This is a container class that allows eIUM SDK developers to create new plug-
Datastore ins to store NMEs in whatever manner is desired. Examples of plug-ins may
include interactions with billing systems or other APIs. An eIUM collector can
directly store NMEs to a target application. In some situations, this may be
more convenient than using an API to create an eIUM application. Note that
using the Data Delivery Agent is usually a better alternative to using the
ApplicationJDBCDatastore. See "Understanding the Data Delivery Agent" (on
page 106) for more information.
the siucleanup command. See the eIUM Administrators Guide for details on using the Launchpad.
See the eIUM Command Reference for details on the siucleanup command.
Database Tables
The datastore component can use the MySQL database (or an external database, such as Oracle) to
provide continuous storage of the NME data. The datastore component stores flushed NMEs in files
or in the database. The datastore also stores history and recovery information in the embedded
database. For each collector the datastore creates three types of tables:
l NME tables or NME files hold the flushed NME data. Multiple tables or files are created to
provide optimum performance and to enable aging of data. Whenever a flush occurs, the NMEs
are copied from the aggregation tree to a database table.
l A history table contains metadata of the NME database tables or files. The history table records
when each flush occurred and in which file or database table the flushed data resides. The
history table facilitates queries of the datastore. It is an internal table that has no external
configuration options.
l A recovery table stores a checkpoint of when the last flush occurred. It is used during recovery if
the collector stops unexpectedly. At each collector flush of the NME data, state information is
saved such as which input file the collector was reading and which line number it was reading.
This state information is also saved during normal collector shut down. Each time the collector
starts up, it starts processing NME data where it left off according to the state information.
In the file-based datastores, the names of the files used to store the NMEs are defined by the
datastores configuration attributes. These file names can include a time stamp, the time zone, NME
data, the collector name, the aggregation scheme name, the input source file name or other
information.
The columns of the NME tables and the NME files are typically just the NME attribute names, defined
using the Attributes configuration attribute configured in the last rule which must be an
AggregationRule or StoreRule.
l VOICE01_RECOVERY is the recovery table, which is used to retain the collector state, if the
collector ever stops unexpectedly. This facilitates restarting the collector from the point at which
it stopped.
l VOICE01_USAGESCHEME0_HISTORY is the history table, which contains information about the
times of the NMEs. This table facilitates queries.
l CORRELATOR1_RECOVERY is the recovery table, which is used to retain the collector state, if the
collector ever stops unexpectedly. This facilitates restarting the collector from the point at which
it stopped.
l CORRELATOR1_USAGESCHEME0_HISTORY is the history table, which contains information about
the times of the NMEs from UsageScheme0. This table facilitates queries.
l CORRELATOR1_SESSIONSCHEME1_HISTORY is the history table, which contains information about
the times of the NMEs from SessionScheme1. This table facilitates queries.
l CORRELATOR1_USAGESCHEME0_1 is the first table that contains NMEs from UsageScheme0.
l When CORRELATOR1_USAGESCHEME0_1 is full, CORRELATOR1_USAGESCHEME0_2 is created.
Additional tables are created as needed. These tables are removed, according to the datastores
aging policy.
l CORRELATOR1_SESSIONSCHEME1_1 is the first table that contains NMEs from SessionScheme1.
l When CORRELATOR1_SESSIONSCHEME1_1 is full, CORRELATOR1_SESSIONSCHEME1_2 is created.
Additional tables are created as needed. These tables are removed, according to the datastores
aging policy.
Table aging allows you to specify when to delete the NME tables or files, based on the TableAgeLimit
configuration attribute. This attribute defines the life span of the NME data that is kept in the
database. NMEs that have an end time attribute value older than that of the NMEs currently being
processed by the duration specified in TableAgeLimit, are removed from the database. All NMEs
must contain an EndTime NME attribute.
The TableAgeLimit is specified in days, hours, minutes, and seconds. For example, 07d00h00h00s
means 7 days, and 02d12h30m00s means 2 days, 12 hours, and 30 minutes. The number of digits
for each field is two or more and is padded with zeros, as in these examples.
A longer duration TableAgeLimit will cause NME data to be kept for a longer time, which also
increases the disk space used by NME data; but it provides a longer time span for the NME data, so
that eIUM applications can work with it. The default TableAgeLimit is 7 days.
NOTE: Be sure you back up any needed data before the aging period deletes the data from the
collector. See the eIUM Administrators Guide for details on backing up eIUM collectors and
components.
Table rolling determines how much data is stored in each table and when a new table is created.
Table rolling is controlled by the TableRollLimit configuration attribute. The TableRollLimit is
specified in days, hours, minutes, and seconds, as it is for the TableAgeLimit.
The datastore uses multiple tables and files to store NMEs. The JDBCDatastore uses a table rolling
algorithm that is based on the time range of the NMEs. The same table is used to store the NMEs
from flush to flush. At collector startup and at each flush time, the JDBCDatastore decides whether
a new table needs to be created to store the NMEs.
Besides facilitating aging of the NME data, having multiple NME tables or files also improves the
query performance by allowing the datastore to query multiple tables or files with the optimum
amount of data, instead of querying a single table or file with a large amount of data.
Table rolling differs slightly in each of the two main datastore types.
l For the JDBCDatastore, the amount of data stored in each table is based on the TableRollLimit
configuration attribute. This attribute defines the duration of the NMEs that should be kept in
each NME data table. At collector startup and at each flush time, the datastore calculates the
difference between the current system time and the StartTime of the current table. If the
difference equals or exceeds the TableRollLimit configuration attribute, the datastore starts a
new table.
l For the FileJDBCDatastore, a new file is created to hold the next set of NMEs whenever a flush
occurs.
Sample Deployment 40
Sample Deployment
The following diagram shows a sample deployment labeled with the three major areas of focus for
an eIUM deployment design process:
l Input Data Sources - This example shows two input data sources, Event Logs from a network
switch device, for example a voice network switch, and a session information source which
contains information about subscribers.
l Data Processing with Business Rules - Collectors read and process the input data. This example
shows four collectors:
n A Leaf Collector reads data from the switch, performs data validation and writes invalid event
The following topics describe an approach to designing the collectors that make up an eIUM
deployment that implements a mediation system.
1. Map the input data fields to the required output data fields.
2. Determine what transformations need to happen to the input data. For example, summing data
such as the number of minutes connected to the network, the number of bytes downloaded,
the cost of each transaction, or correlating usage data and session data.
3. Determine what data must be validated. If not already designed, determine how you will
examine, detect and handle invalid data. For example, discard invalid data, park invalid data in
separate files for later manual review, correct and reprocess the repaired data.
4. Partition the data transformations among collectors and among rule chains in each collector.
5. Design the collectors and rule chains that transform the input data to the appropriate output
data and formats and handle data validation and reprocessing.
6. Build each collector and test with sample data. Build the next collector in the chain and test. Use
actual data for sizing and performance testing.
1. Determine the services that require authorization. For example, mobile phone access, wireless
network access or premium services.
2. Determine the protocol the services use for authorization. For example, Diameter or RADIUS.
3. Determine the type of requests or messages that will be received by the charging manager. For
example, network connect and disconnect requests, session start, continue and stop messages,
or service authorization requests.
4. Determine what other applications need to be queried for information to decide whether a
particular subscriber is authorized to use a particular service. For example, a user repository, a
balance manager, a rating engine, or a database.
5. Design the rule chains that will receive each type of incoming request or message, the
processing that needs to take place, and the response that needs to be constructed and sent
back to the client.
6. Build and test a session server and related components. See the eIUM Real-time Guide for more
information.
Configuring eIUM
eIUM is a component-based system that includes many factory-supplied components for collecting,
processing (aggregation, correlation, adornment, lookups, and so forth), storing, and delivering
data. Its flexible component architecture allows eIUM to support service infrastructures with a
variety of data sources, business processing rules, and downstream applications. You specify the
components in your deployment and the components behavior through configuration. eIUM enables
quicker configuration by providing templates and wizards for many input data sources and eIUM
components. This following topics show you how to configure eIUM using these tools.
Configuration Attributes 49
Sample Configuration 50
Linked Collectors 53
Unlinked Collectors 53
Linked Collectors 54
The /deployment configuration node contains the main configuration for eIUM collectors and
servers. To view the deployment hierarchy run the Launchpad tool.
1. On Windows, select Start -> Programs -> Internet Usage Manager -> SIU -> Launchpad.
2. On UNIX, execute the /opt/bin/SIU/launchpad command.
The Deployment tree is displayed in the left pane of the Launchpad as shown below. See the eIUM
Administrators Guide for more information on the Launchpad tool.
Under the /deployment configuration node, each host on which eIUM is installed is represented by a
host node [/deployment/hostname]. Under each host node, each collector running on that host is
represented by a collector node [/deployment/hostname/collector-name]. Other servers running on
the host, such as the ConfigServer which manages the configuration, WebAppServer (Web
Application Server) which generates reports from collectors, the PolicyServer used in dynamic SNMP
data collection, and the JBossServer used in consolidated logging are represented by corresponding
subnodes.
The configuration hierarchy in the above figure, for example, contains one sub-node, Host01,
representing the only host on which eIUM is installed in this deployment. On this host are several
different collectors (Correlator, FC01, FC02, Reporting, SessionCollector, UsageCollector, VoiceA and
VoiceB), a file collection service (FCS), a file distribution service (FDS) and three servers
(ConfigServer, JBossServer and ReportServer), each represented by a subnode under the host
subnode, Host01.
NOTE: Collector and server names must be unique across your entire deployment, even across
different hosts. These names must not start with a number and must not contain dashes or
spaces.
If you are using an Oracle database, the sum of the number of characters in the collector name
and scheme name must not exceed 20 characters.
This displays the Deployment Editor which shows the entire configuration hierarchy.
The configuration tree organizes configuration items like the folder or directory hierarchy organizes
files in the Windows or UNIX file system. Each node in the configuration tree stores the
configuration entries for a single eIUM component or process. The following list describes each top
level configuration node in detail.
CollectionPolicy Contains configurations used by the Policy Server to collect data from
dynamic SNMP network elements.
collectors Contains the CORBA IOR addresses for each collector in the deployment. If
security is enabled, this node also contains the secure CORBA addresses for
each collector.
export Contains information for external processes such as logging for OpenView
Operations.
ManagementServers Represents the Management Server. For more information, see the
com.hp.usage.managementservice.ManagementService component in the
eIUMComponent Reference.
NMESchema Contains the list of all traditional NME attributes. Collectors process usage
data by converting raw usage or session data into Normalized Metered
Events, or NMEs. An NME is an eIUM record whose fields correspond to the
fields in the input record for a usage event. Each field of data in an NME is
an NME attribute. eIUM components process NMEs. See "NMEs and the NME
Schema" (on page 56). See also SNMESchema below.
PolicyServer Contains the configuration of the Policy Server, which collects data from
dynamic SNMP network elements.
Node Description
SNMESchema Contains the list of all structured NME attributes and types. Collectors
process usage data by converting raw usage or session data into
Normalized Metered Events, or NMEs. An NME is an eIUM record whose
fields correspond to the fields in the input record for a usage event. Each
field of data in an NME is an NME attribute. eIUM components process
NMEs. See "Using Structured NMEs" (on page 118) for more information.
Every collector node contains the configurations for all the components that comprise that
collector. Under the collector node, each collector has an Encapsulator node, an Aggregator node
and a Datastore node. Each of these nodes contains configuration attributes and configuration
subnodes.
[/deployment/SYS10/Voice25]
# Configurations for the collector named Voice25 running on SYS10.
[/deployment/SYS10/Voice25/Encapsulator]
# Configurations for this collectors encapsulator.
[/deployment/SYS10/Voice25/Aggregator]
# Configurations for this collectors Aggregator
[/deployment/SYS10/Voice25/Datastore]
# Configurations for this collectors Datastore
In the following figure, for example, the deployment contains a host called Host01 running a
collector called SessionCollector. The Encapsulator node of this collector is expanded to show the
Encapsulator configuration attributes and the FileRollPolicy, FlushPolicy and Parser subnodes. The
Parser subnode is expanded to show its configuration attributes.
Configuration Attributes
Each node of the configuration tree can contain configuration attributes, which are Name=Value
pairs that define the behavior of that particular component. For example, in the figure in "Collector
Configuration Nodes" (on page 48), the value of the UpdateTime configuration attribute is true. This
attribute is part of the Encapsulator subnode. All configuration attributes for each component are
described in the eIUM Component Reference (click the "Attributes" index link, where you can view all
Attributes alphabetically in the eIUM Component Reference).
For example, the Encapsulator configuration in the figure in "Collector Configuration Nodes" (on
page 48) shows the single-valued attribute FieldDelimiter with the value |. This attribute is under
the Parser subnode. The configuration attribute named Attributes is a multi-valued attribute with
five values:
EndTime
SrcIPStart
SrcIPEnd
LoginID
AcctNum
AcctStatusType
Each value of a multi-valued attribute is represented visually in the Deployment Editor as a child of
the attribute name.
For example, the following shows part of the Encapsulator node from "Collector Configuration
Nodes" (on page 48) with the ClassName attribute set to LogFileEncapsulator.
[/deployment/Host01/SessionCollector/Encapsulator]
ClassName=LogFileEncapsulator
Description=Processes event records from a file-based or record-based
data source.
UpdateTime=true
All components are described in detail in the eIUM Component Reference, which is organized by the
component name as used in the ClassName attribute. Components are also organized by categories,
attributes, and packages in the eIUM Component Reference. Each component in the eIUM Component
Reference also describes all its configuration attributes. Each configuration attribute provides a way
to customize the behavior of the component. See "Configuration Attributes" (on page 49).
Sample Configuration
Part of the configuration for a collector named DemoCollector01 is shown below. Notice that it is in
the configuration node [/deployment/Host01/DemoCollector01] meaning that this collector will run
on the eIUM system named Host01. The next level collector configuration nodes correspond to the
primary collector components Encapsulator, Aggregator and Datastore. The order of these nodes in
a text file (as produced by the saveconfig command) is irrelevant. What is relevant and what
determines how a collector behaves are the node names and the names of the configuration
attributes following each configuration node name, in particular the ClassName attribute as
described above. See also "Collector Configuration Nodes" (on page 48) and "Configuration
Attributes" (on page 49).
[/deployment/Host01/DemoCollector01]
AdminInterface=
ClassName=com.hp.siu.adminagent.procmgr.CollectorProcess
Description=Demo collector.
QueryInterface=
[/deployment/Host01/DemoCollector01/Aggregator]
ClassName=Aggregator
Description=Aggregator consists of a single IPUsage aggregation scheme
SchemeNames=IPUsage
[/deployment/Host01/DemoCollector01/Datastore]
ClassName=FileJDBCDatastore
Database=jdbc:mysql://localhost:3306/siu20
DatabaseClass=com.mysql.jdbc.Driver
Description=Stores event records in binary format to a file
Password=siu20
TableAgeLimit=7d0h0m0s
TableRollLimit=1d0h0m0sUser=siu20
[/deployment/Host01/DemoCollector01/Encapsulator]
ClassName=DemoEncapsulator
Description=Generates a stream of pseudo-random NMEs, useful for
testing purposes
JitterTime=11
MaxNMERate=10
NMEFields=StartTime,,0,20,*10
NMEFields=EndTime,,20,30,*10
NMEFields=SrcIP,,15.0.0.0,15.0.0.19
NMEFields=DstIP,, 17.0.0.0, 17.0.0.9
NMEFields=NumBytes64,800,100,5000,+100
[/deployment/Host01/DemoCollector01/Encapsulator/FlushPolicy]
ClassName=TimeFlushPolicy
ClockInterval=15m
Description=Flushes 15 minute worth of event records to the datastore
The following example shows the complete Aggregator configuration entry for this collector. This
example shows the collectors only aggregation scheme or rule scheme. Collectors can have one or
more rule schemes. Notice that the all configurations are under the Aggregator node. The
aggregator's rule scheme contains three attributes: ClassName, Description and SchemeNames.
The ClassName attribute specifies which eIUM component is operating: the Aggregator component.
The SchemeNames attribute names all the rule schemes, in this case just one: IPUsage. IPUsage is
another configuration subnode under the Aggregator node.
The IPUsage node uses an AggregationScheme component and specifies two rules in the rule
scheme with the RuleNames attribute. The RuleNames attribute is a multi-valued attribute. That is,
it has two attribute values: GroupNMEs and Aggregate. These attributes define the configuration
subnodes where the actual rules to be executed are defined. It is important to realize that the order
of the RuleNames attributes specifies the order of execution of the rules, not the order of the
information in the text file. See the AggregationScheme component in the eIUM Component
Reference for complete details on this and all components and their configuration attributes.
[/deployment/Host01/DemoCollector01/Aggregator]
ClassName=Aggregator
Description=Aggregator consists of a single IPUsage aggregation scheme
SchemeNames=IPUsage
[/deployment/Host01/DemoCollector01/Aggregator/IPUsage]
ClassName=AggregationScheme
Description=Aggregates usage event records grouped by Source and
Destination IP
RuleNames=GroupNMEs
RuleNames=Aggregate
[/deployment/Host01/DemoCollector01/Aggregator/IPUsage/Aggregate]
ClassName=AggregationRule
Description=Retains minimum StartTime and maximum Endtime and adds
usage attributes
Attributes=SrcIP
Attributes=DstIP
Attributes=NumBytes64,add
Attributes=StartTime,min
Attributes=EndTime,max
[/deployment/Host01/DemoCollector01/Aggregator/IPUsage/GroupNMEs]
ClassName=HashMatchRule
Description=Groups event records by Source and Destination IP
MatchKeyNames=SrcIP
MatchKeyNames=DstIP
For the complete configuration of this collector you can create a collector using the collector
template Demo - Simple using the Launchpad. After you create the collector you can view and edit
its configuration in the Launchpad or you can save its configuration in a text file using the File ->
Export Configurations menu item. Or you can view the template for the Demo - Simple collector in
the Launchpad.
When you modify the configuration of a collector or process, the changes are written to the
configuration store but the collector is not aware of these changes. You must restart the collector
so the collector reads and uses the new configuration.
NOTE: When loading configurations with the Launchpad or the loadconfig command, make sure
you load valid configurations as the configurations are simply copied into the configuration
server.
l Configuration Nodes - Represents a location in the configuration hierarchy. The entry is wrapped
in square brackets and shows the path to the configuration node. For example, below is the
configuration entry for the Encapsulator node of the collector named Collector1 on the eIUM
host named host01. This entry contains the configuration attributes that determine the
l Configuration Attributes - Represents a Name=Value pair that determines the behavior of that
particular component. Each configuration attribute has the following format:
<attribute name>=<attribute value>
For example, the following attribute represents a configuration attribute named InitialInputFile
that has a value of fixedip11092000.log.
InitialInputFile=fixedip11092000.log
NOTE: Configuration nodes and configuration attribute names are case sensitive.
Linked Collectors
Linked collectors are collectors that share a common configuration. Linked collectors greatly
simplify the creation and management of multiple collectors that have nearly identical
configurations.
Unlinked Collectors
Linked collectors are best described by contrasting them with ordinary collectors or unlinked
collectors. In unlinked collectors, each collector specifies all of its own configurations. When you
need many similar collectors, you must duplicate all the common configurations, changing only
those configurations that are unique for each individual collector. The following diagram represents
four nearly identical collectors. They only differ in the name of the collector (as specified by the
configuration node) and the IPAddress attribute.
Linked Collectors
When you have multiple nearly identical collectors, you can share configurations by using linked
collectors. Linked collectors link to a master template collector and obtain their configurations from
the master template. Each individual collector can override any of the configurations from the
master. The master defines all the common configuration attributes. Each actual collector uses a
Link attribute that refers to the master template configuration.
The example below defines a master template collector at the configuration node
[/template/custom/DemoMaster1]. Each individual collector has a Link attribute that refers the
master. Then each individual collector defines only the IPAddress attribute, which overrides the
attribute value copied from the master template.
4. Provide a name for the template and click OK. This creates a new subnode in the configuration
hierarchy /templates/custom and places the new template there.
For example, if you created a master collector template named MasterVoice01, the
configurations for this collector would be at the following configuration node:
[/template/custom/MasterVoice01]
1. Select the menu item Tools ->Deployment Editor. This brings up a window showing the entire
configuration hierarchy.
2. Double click the deployment node to open it and display the eIUM hosts.
3. Select the host where you want the collector to run.
4. Right click on the host and select the menu item Add Sub-node.
5. Type the name of the collector you want to create.
6. Select the new node you just created.
7. Right click on the node and select the menu item Add Attribute.
8. Type in the attribute name Link and click OK.
9. Type in the configuration path to the template: /templates/custom/<template name>.
For example, if you named the template VoiceMaster, you would type in
/templates/custom/VoiceMaster.
10. Click OK in the Deployment Editor window.
The new collector is displayed in the Launchpad window. You can perform all operations on
linked collectors the same as any other collector.
Alternatively you could create a template of the linked collectors using the Actions -> Save as
Template menu item and create additional linked collectors from the template.
[/deployment/hostname/VoiceA]
Description= Linked collector reads CDRs from voice switch A.
Link=/templates/custom/MasterVoice01
The example below shows part of the configuration for the master collector named MasterVoice01.
Note that this configuration is the complete configuration for a collector. The only difference is that
it appears under the /templates/custom configuration node rather than under a
/deployment/hostname node.
[/templates/custom/MasterVoice01]
AdminInterface=
ClassName=com.hp.siu.adminagent.procmgr.CollectorProcess
Description=Master collector for multiple linked collectors.
QueryInterface=
[/templates/custom/MasterVoice01/Aggregator]
ClassName=Aggregator
Description=Aggregator consists of a single aggregation scheme.
SchemeNames=ValidateCDRs
SchemeNames=FilterCDRs
SchemeNames=RateCDRs
SchemeNames=AggregateCDRs
...
As data is read in by a collectors encapsulator, the parser extracts each data field and places the
data value into the appropriate NME attribute in the NME. The following diagram shows a sample
NME with data values:
NOTE: eIUM supports traditional NMEs, which are flat data structures, and structured NMEs which
are hierarchical data structures. This section describes traditional flat NMEs. For details on
structured NMEs, see "Using Structured NMEs" (on page 118).
The NME attributes that compose the NME for a particular collector are usually defined in the parser
component. See the parsers described in the eIUM Component Reference for complete details.
The NME Schema defines all the NME attributes you can use in NMEs. That is, the NME schema
defines the names of all NME attributes and assigns a type to each name. Every NME attribute must
be defined in the NME schema before it can be used in any collector or component. For example, the
following shows a few NME attributes defined by the NME schema:
[/NMESchema]
Attributes=AccountCode,com.hp.siu.utils.StringAttribute
Attributes=AccountingDataAge,com.hp.siu.utils.IntegerAttribute
Attributes=AcctNum,com.hp.siu.utils.StringAttribute
Attributes=AcctStatusType,com.hp.siu.utils.StringAttribute
Attributes=ActiveTime,com.hp.siu.utils.IntegerAttribute
Attributes=AdditionalCallIndicators,com.hp.siu.utils.BinaryAttribute
Attributes=AdditionalDigitsDialed,com.hp.siu.utils.StringAttribute
...
IPAddrAttribute IP address
UUIDAttribute Universal Unique Identifier, a 16-byte binary array structure, which can be
used to uniquely tag a set of NMEs across time or systems. Useful for the
IPDR standard and data auditing, it is based on the BinaryAttribute. For
more information on UUIDs, see http://www.ipdr.org.
l In the Launchpad Tools -> NME Schema Editor to run the Schema Editor and use the Add button
to add new NME attributes.
l Use the Launchpad Tools -> Deployment Editor menu item to run the Deployment Editor and add
attributes under the /NMESchema node.
l Create a text file like the one shown above and use the loadconfig command to introduce the
new NME attributes into the schema.
l Structured NMEs store complete information about the hierarchical arrangement of complex
data records.
l Structured NMEs contain information about which data fields have been set and which have not.
l Structured NMEs can handle optional data fields.
Structured NMEs retain all the hierarchical information of structured data. For more information on
structured NMEs and the structured NME schema, see "Using Structured NMEs" (on page 118).
One of the primary capabilities of a mediation system is to provide an efficient and effective error
handling mechanism to ensure minimum revenue leakage and proper auditing of every transaction
which flows through the network. Any errors in mediation should be handled gracefully so that these
errors can be caught early in the processing chain and corrected.
The eIUM error handling solution provides a way to segregate CDRs that contain errors from valid
CDRs. The error CDRs are stored in separate files of NMEs by the collector. These files can be
manually edited and corrected using the CDR Editor tool. After correcting the error CDRs, they can
be reprocessed by a collector designed for this purpose, thereby reintroducing the corrected NMEs
back into the meditation processing chain. The eIUM error handling solution provides a robust and
complete feature set for detecting, correcting and reprocessing error CDRs.
l "Overview of Detecting Errors and Handling Errors" (on page 60) describes the type of errors that
can occur and how eIUM collectors can detect and handle them.
l "Solution Architecture" (on page 62) provides an overview of one eIUM error processing solution
that lets you detect and correct parse errors and validation errors.
l "Enabling Error Detection and Parking" (on page 63) describes how to enable the error
processing solution.
l "Detecting Validation Errors Using PostParsedRules" (on page 65) describes how you configure
rules to check your data for unexpected values.
l "Parking Error CDRs" (on page 66) explains how NMEs with parse errors or validation errors are
stored by eIUM.
l "Correcting Error CDRs with the CDR Editor" (on page 70) gives an overview of the CDR Editors
capabilities. For complete details see the eIUM Administrators Guide.
l "Reprocessing Corrected CDRs" (on page 70) describes how to reintroduce the corrected CDRs
into the eIUM mediation system.
l "Parsers that Support Error Handling" (on page 72) lists eIUM parsers that support error handling
with this solution.
data fields in the records. You can optionally configure eIUM components to check the data values in
data fields and detect validation errors. eIUM does not automatically detect validation errors. The
three types of errors eIUM can detect are:
l Record Error: If the data is not formatted correctly as a record, then this is a record error. This
kind of error occurs if the collector is unable to read a record correctly or is unable to find the
length, type or other required information of the record, or the data is not well formed as a
record.
l Parse Error: If the data in a particular field in a record cannot be extracted correctly then the
error is a parse error.
l Validation Error: After the data in a field is parsed, if the value is not within the valid range as
defined in the configuration, a validation error is reported.
Once an error is detected, it can be handled in any of several different ways. For example, the error
record can be discarded. Or it can be parked for later manual inspection and repair. Or the error
field can be marked for later manual inspection and repair. The following table summarizes the
types of errors that can be detected, the default response, other possible responses and how you
configure each response. These are described in detail in the rest of this topic series.
Record error - The record Log the error and stop Log the error. Use the
could not be detected. the collector. Stop the RecordEncapsulators
collector. CleanupOnRecordError,
Drop the LogOnRecordError,
record. PurgeOnRecordError or
Park the EndOnRecordError
record. attributes.
Drop the file. Specify cleanup handlers.
Park the file.
Parse error - A field in the Log the error and Log the error. Use the
record could not be parsed. continue processing Stop the RecordEncapsulators
the record. collector. EndOnParseError,
Drop the PurgeOnParseError,
record. PauseOnParseError,
Park the CleanupOnParseError or
record. DeferCleanupOnParseError
Specify a attributes.
default value. Specify cleanup handlers.
Drop the file. Use the
Park the file. RecordEncapsulators
Mark the field EnableErrorParking
for the CDR attribute and the CDR
editor. Editor.
Validation error - A field in the None. Mark the field Use the
record contains an unexpected for the CDR RecordEncapsulators
value. Editor. EnableErrorParking
attribute and the CDR
Editor.
Solution Architecture
The eIUM error handling solution detects and parks error CDRs in separate files. You can manually
correct the error CDRs with the CDR editor. The corrected CDRs can be reprocessed with separate
collectors. The following diagram shows the main components of the error handling solution:
l The Primary Collector detects error CDRs and segregates them from valid CDRs.
l The CDR Editor which you can use to manually correct error CDRs.
l The Corrected NME collector reads the corrected CDRs and processes them.
l The DatasetMux collector combines the valid and corrected CDRs and makes them available to
other collectors or to business applications.
The figure below shows the error handling components in more detail. These components are:
1. Encapsulator and rules for detecting errors in CDRs: The parser and the post-parsed rules are
the primary components that detect parse errors and validation errors. These components also
update internal marker attributes in the NME.
2. Error scheme and datastore for parking error CDRs: The error CDRs are converted to an NME
along with internal marker attributes. These NMEs are processed by a set of aggregation
schemes designated as error schemes and are subsequently stored in the internal NME format
in a datastore (FileJDBCDatastore).
3. CDR Editor for correcting error CDRs: Use the CDR Editor utility to manually correct error
CDRs.
4. Collector for reprocessing corrected CDRs: Use a collector to process the corrected CDRs. This
collector is configured to read and process the corrected CDRs.
The figure below illustrates the data flow through the system.
internal error attributes are updated and the parser continues parsing the next available data in the
CDR.
You enable a collector to handle parse errors by setting the value of the Boolean configuration
attribute EnableErrorParking in the encapsulator. By default its value is false, and hence error
detection is not enabled. To turn this feature on set the value of this attribute to true.
Syntax
EnableErrorParking=<Boolean value>
Example
The following sample configuration shows a RecordEncapsulator with error handling enabled.
[/deployment/host/collector/Encapsulator]
ClassName=RecordEncapsulator
EnableErrorParking=true
After parsing, the encapsulator sends the NME to PostParsedRules (discussed in the next section)
for data validation and then to the aggregation schemes for handling.
NOTE: When you enable error parking, the collector adds the following five additional attributes
to each NME. These are internal attributes and they are created and used by the collector only
when error detection is enabled.
NOTE: When the value of the EnableErrorParking attribute is false or not configured and a
collector encounters a parse error, the collector throws a ParserException. The collector can be
configured to continue processing by skipping that CDR or it can stop processing. The following
configuration attributes specify the action the collector takes after encountering a parse error:
CleanupOnParseError
DeferCleanupOnParseError
EndOnParseError
PurgeOnParseError
PauseOnParseError
See the RecordEncapsulator description in the eIUM Component Reference for complete details.
PostParsedRules specifies one or more rules that execute after the NME is constructed and before
the NME is passed to the aggregator. You can use the NMEValidationRule within PostParsedRules to
detect validation errors. To use the NMEValidationRule, you specify the range of valid values each
NME attribute can take. Actually, you specify the range of invalid data for each NME attribute in the
NMEValidationRules ErrorCondition attribute. The NMEValidationRule compares each NME attribute
value to the specified values. However, once an error condition is met for a particular attribute of an
NME, no further rules are applied for that attribute. The NMEValidationRule does not attempt to
check the validity of fields with a parse error.
Whenever an invalid NME attribute value is detected, the NMEValidationRule marks the NME as an
error NME, updates the internal error attributes with specific information about the validation error,
and continues checking the next attribute. After all the rules in PostParsedRules are executed, the
encapsulator passes the NME to the aggregator.
To use the NMEValidationRule, you must set EnableErrorParking to true. This is because the
NMEValidationRule requires the internal error attributes added to the NME by setting
EnableErrorParking to true. Otherwise the NMEValidationRule will fail.
NOTE: The rules specified by PostParsedRules are always executed regardless of the value of
EnableErrorParking. Setting EnableErrorParking to true enables the NMEValidationRule to be
used.
For more information on the NMEValidationRule, see the eIUM Component Reference. For more
information on PostParsedRules, see the RecordEncapsulator in the eIUM Component Reference.
Example
For this example assume the value of SrcPort must be between 3250 and 4000, inclusive, and
DstPort must have a value greater than or equal to 3970. Below is an NMEValidationRule that
performs this validation. Notice the ErrorCondition attributes specify the range of values that make
the data invalid. That is, if the condition is true, the data is invalid.
[/deployment/host/collector/Encapsulator]
ClassName=RecordEncapsulator
EnableErrorParking=true
PostParsedRules=ValidatePorts
[/deployment/host/collector/Encapsulator/ValidatePorts]
ClassName= NMEValidationRule
ErrorCondition=SrcPort,<,3250
ErrorCondition=SrcPort,>,4000
ErrorCondition=DstPort,<,3970
When error handling is enabled by setting the EnableErrorParking attribute to true in the
encapsulator, you specify each aggregation scheme as either an error NME scheme or a valid NME
scheme. eIUM automatically adds a filter rule to each scheme so error schemes only process error
NMEs and valid schemes only process valid NMEs. The error scheme would typically use only a
StoreRule to store the error NMEs to a datastore for subsequent manual correction.
Error Scheme
Error NME schemes are those aggregation schemes that process error NMEs and store the error
NMEs in the datastore. You must specify all aggregation schemes in the SchemeNames attribute of
the Aggregator. You specify one or more aggregation schemes as error schemes by specifying them
in the ErrorSchemeNames attribute. Any aggregation scheme can be designated an error scheme by
configuring the scheme name in ErrorSchemeNames.
Syntax
ErrorSchemeNames=<scheme-name>
Where <scheme-name> is the name of an aggregation scheme. This name must also be configured
with the SchemeNames attribute of the Aggregator component.
Example
The following example shows two aggregation schemes configured in the aggregator, named
FirstScheme and SecondScheme. SecondScheme is designated as an error scheme. FirstScheme is a
valid NME scheme.
[/deployment/host/collector/Aggregator]
ClassName=Aggregator
ErrorSchemeNames=SecondScheme
SchemeNames=FirstScheme
SchemeNames=SecondScheme
[/deployment/host/collector/Aggregator/FirstScheme]
...
[/deployment/host/collector/Aggregator/SecondScheme]
...
Since the last rule of any aggregation scheme is typically a rule that persists NMEs, (for example
AggregationRule or StoreRule), for an error scheme the last rule should be a StoreRule, with all the
attributes of the NME configured. However, the internal error information attributes need not be
explicitly configured since the collector automatically stores the error attributes with the NME.
To use the CDR Editor, the error scheme must be configured with a FileJDBCDatastore. The CDR
Editor can only read CDRs from a FileJDBCDatastore. It cannot read from any other type of
datastore.
How you configure the datastore for an error handling scheme depends on which datastore you use
for your valid NME schemes.
l If your valid NME schemes use FileJDBCDatastore, no change is required. Simply send the error
NMEs to the configured datastore.
l If your valid NME schemes use a MuxDatastore with a FileJDBCDatastore already beneath it, use
the FileJDBCDatastore for the error NMEs. Otherwise add a FileJDBCDatastore to your
MuxDatastore for the error NMEs.
l If your valid NME schemes use a datastore other than FileJDBCDatastore, add a MuxDatastore,
place your datastore beneath it and add a FileJDBCDatastore for the error NMEs.
For complete details on datastores and the MuxDatastore, see the eIUM Component Reference.
Configuration Summary
This section summarizes the configurations you need to enable error handling.
Encapsulator Configurations
l EnableErrorParking attribute: The value of the EnableErrorParking Boolean attribute
determines whether error handling is enabled or not. This attribute is configured at the
Encapsulator node. The default value is false.
/deployment/host/collector/Encapsulator
EnableErrorParking=True # Enables error handling
l NMEValidationRule: When configured under PostParsedRules, this rule checks each NME
attribute against a range of invalid values and marks each invalid NME attribute.
[/deployment/host/collector/Encapsulator/MyValidationRules]
ClassName=NMEValidationRule
ErrorCondition=SrcPort,<,3250
ErrorCondition=SrcPort,>,5000
Aggregator Configurations
ErrorSchemeNames attribute: This Aggregator attribute marks an aggregation scheme to be used
only for error NMEs. The value of ErrorSchemeNames must be also be named in the SchemeNames
attribute. Only error NMEs are processed by the error schemes.
[/deployment/host/collector/Aggregator]
ClassName=Aggregator
ErrorSchemeNames=Scheme1
SchemeNames=Scheme1
SchemeNames=Scheme2
Datastore Configurations
FileJDBCDatastore: Error NMEs must be stored in a FileJDBCDatastore if you intend to use the CDR
Editor.
Configuration Example
This configuration shows a collector that detects and parks error NMEs. The encapsulator checks if
the value of SrcPort is between 3250 and 4000. The aggregation scheme named Error parks error
NMEs in the datastore.
[/deployment/host/ErrorCollector]
ClassName=com.hp.siu.adminagent.procmgr.CollectorProcess
Description=Test collector for Error Parking
[/deployment/host/ErrorCollector/Aggregator]
ClassName=Aggregator
Description=Aggregator consists of a single Usage aggregation scheme
SchemeNames=Usage
SchemeNames=Error
ErrorSchemeNames=Error
[/deployment/host/ErrorCollector/Aggregator/Error]
ClassName=AggregationScheme
Description=Stores error NMEs in the datastore for manual correction.
RuleNames=ErrorRule
[/deployment/host/ErrorCollector/Aggregator/Error/ErrorRule]
ClassName=StoreRule
Description=Error NME data
Attributes=SrcIP
Attributes=DstIP
Attributes=SrcPort
Attributes=DstPort
Attributes=ProtocolName
Attributes=NumPackets
Attributes=StartTime
Attributes=EndTime
[/deployment/host/ErrorCollector/Aggregator/Usage]
ClassName=AggregationScheme
Description=Aggregates usage event records grouped by Source and
# Destination IP
RuleNames=GroupNMEs
RuleNames=Aggregate
[/deployment/host/ErrorCollector/Aggregator/Usage/GroupNMEs]
ClassName=HashMatchRule
Description=Groups event records by Source IP and Destination IP
MatchKeyNames=SrcIP
MatchKeyNames=DstIP
[/deployment/host/ErrorCollector/Aggregator/Usage/Aggregate]
ClassName=AggregationRule
Description=Retains minimum StartTime and maximum EndTime and adds
usage attributes
Attributes=SrcIP
Attributes=DstIP
Attributes=SrcPort
Attributes=DstPort
Attributes=ProtocolName
Attributes=NumPackets,add
Attributes=StartTime,min
Attributes=EndTime,max
[/deployment/host/ErrorCollector/Datastore]
ClassName=FileJDBCDatastore
Database=jdbc:mysql://localhost:3306/siu20
DatabaseClass=com.mysql.jdbc.Driver
Description=Stores event records in binary format to a file
Password=siu20
TableAgeLimit=7d0h0m0s
TableRollLimit=1d0h0m0s
User=siu20
[/deployment/host/ErrorCollector/Encapsulator]
ClassName=RecordEncapsulator
Description=Processes event records from a file-based or record-based
# data source on the host machine
JitterTime=310
EnableErrorParking=true
PostParsedRules=ConditionSrcPort
[/deployment/host/ErrorCollector/Encapsulator/ConditionSrcPort]
ClassName=NMEValidationRule
ErrorCondition=SrcPort,<,3250
ErrorCondition=SrcPort,>,4000
[/deployment/host/ErrorCollector/Encapsulator/FlushPolicy]
ClassName=TimeFlushPolicy
ClockInterval=30m
Description=Flushes 30 worth of event records to the datastore
[/deployment/host/ErrorCollector/Encapsulator/RecordFactory]
ClassName=DelimiterRecordFactory
Delimiters=\r\n
Delimiters=\n
[/deployment/host/ErrorCollector/Encapsulator/RecordFactory
/StreamSource]
ClassName=FileSource
Description=A file based data source
TailingMode=none
[/deployment/host/ErrorCollector/Encapsulator/RecordFactory
/StreamSource/FileRollPolicy]
ClassName=SequenceNumberFilePolicy
SrcDir=%VARROOT%/SampleData/DataFiles
BaseFileName=Data
InitialInputFile=Data1.log
Suffix=.log
[/deployment/host/ErrorCollector/Encapsulator/Parser]
ClassName=DelimiterParser
Description=Parses Netflow records which are delimited by a |
character
Attributes=SrcIP
Attributes=DstIP
Attributes=SrcPort
Attributes=DstPort
Attributes=ProtocolName
Attributes=NumPackets
Attributes=StartTime
Attributes=EndTime
FieldDelimiter=|
Trim=true
TimeStampFormat=MM/dd/yyyy HH:mm:ss
Configuration Example
The configuration below shows a collector that reads NMEs written to a FileJDBCDatastore using an
NMEFileEncapsulator. This collector reads the files in the directory
%VARROOT%/SampleData/CorrectedFiles.%VARROOT% represents the var directory under the eIUM
installation directory.
[/deployment/host/ReprocessingCollector]
ClassName=com.hp.siu.adminagent.procmgr.CollectorProcess
Description=demo collector
ForcedStop=false
[/deployment/host/ReprocessingCollector/Encapsulator]
ClassName=NMEFileEncapsulator
[/deployment/host/ReprocessingCollector/Encapsulator/FileRollPolicy]
ClassName=DirectoryPolicy
BatchMode=false
DirectoryName=%VARROOT%/SampleData/CorrectedFiles
[/deployment/host/ReprocessingCollector/Aggregator]
ClassName=Aggregator
Description=Has two schemes to aggregate and store data.
SchemeNames=StoreData
[/deployment/host/ReprocessingCollector/Aggregator/StoreData]
ClassName=AggregationScheme
Description=Has a Store Rule to store NMEs without aggregation.
RuleNames=Store
[/deployment/host/ReprocessingCollector/Aggregator/StoreData/Store]
Attributes=SrcIP
Attributes=DstIP
Attributes=SrcPort
Attributes=DstPort
Attributes=ProtocolName
Attributes=NumPackets
Attributes=StartTime
Attributes=EndTime
ClassName=StoreRule
[/deployment/host/ReprocessingCollector/Datastore]
ClassName=FileJDBCDatastore
Database=jdbc:mysql://localhost:3306/siu20
DatabaseClass=com.mysql.jdbc.Driver
Description=Stores event records in binary format to a file
Password=siu20
TableAgeLimit=7d0h0m0s
TableRollLimit=0s
User=siu20
With CDR error handling enabled, you typically need three collectors instead of one when processing
data from a single data source. One collector processes valid CDRs and separates out the error
CDRs. Another collector reprocesses corrected CDRs. The third collector merges the data processed
by the other two collectors. Any downstream collector should query the third collector to ensure
that all the CDRs from the data source are consumed.
See "Solution Architecture" (on page 62) for a diagram showing all three collectors.
l AMAMuxParser
l DelimiterParser
l DMS100OffsetParser
l EWSDParser
l FixedWidthAsciiParser
l NameValueParser
l NetlowParser
l NetflowProtocolParser
l OffsetParser
l OVPAParser
l PerlRegexParser
l RadiusParser
l RegexParser
l SMDParser
l TextOffsetParser
l TLVParsers
l TypedMuxParser
l WapTLVParser
You can configure a duplicate detection mechanism to identify and prevent duplicate CDRs from
entering the processing chain. This filtering mechanism consists of various duplicate detection rules
which can be used in different scenarios. This chapter describes and compares the eIUM duplicate
detection rules and helps you decide which rule will work best for your situation. For complete
details on these rules and all eIUM components, see the eIUM Component Reference.
Introduction 75
Design Questions 75
DuplicateNMEDetectorRule 76
Recovery 76
Aging Mechanism 76
DuplicateCDRDetectorRule 76
Recovery 77
Aging Mechanism 77
TimeHashDuplicateCDRDetectorRule 77
Recovery 78
Aging Mechanism 78
TimeIntervalDuplicateCDRDetectorRule 78
Recovery 79
Aging Mechanism 79
Performance Comparison 80
Performance Statistics 81
Introduction
eIUM provides the following four duplicate detector rules. Each rule saves information about each
NME encountered such as hash keys or NME attribute values over a period of time and compares
the current NME with previous NMEs. When the information matches, the current NME is considered
a duplicate.
1. No duplicate NME passes through the rule undetected. That is, duplicates are always found.
2. No NME is falsely flagged as a duplicate. That is, false detection of duplicates never happens.
All four eIUM duplicate detection rules satisfy point 1 above. However, point 2 is true only for those
rules that compare both hash codes and NME attribute values. The less accurate rules have a
potential to falsely flag an NME as a duplicate because they compare only hash codes but not the
actual NME attribute values. This makes them only as accurate as the hashing algorithm they use
because of the possibility of hash collisions. See also "Accuracy and Reliability" (on page 82).
The aging period specifies the set from among which NMEs are considered for duplicate detection.
For example, configuring an age period of 24 hours indicates that the incoming NME will be
compared with all NMEs from the last 24 hours. If an NME arrives that is a duplicate of an NME that
arrived within this 24-hour window, it will be detected as a duplicate. If an NME arrives that is a
duplicate of an NME that arrived before this 24-hour window, it will not be detected as a duplicate.
You need to specify the period of time over which duplicates will be checked based on when you
predict duplicates can occur.
Design Questions
Below are some questions to ask yourself when deciding which rule to use:
l How do you determine if an NME is a duplicate? That is, which NME attributes need to be
compared to detect a duplicate? If you can limit the number of NME attributes that need to be
compared, you can reduce resource usage and improve performance.
l Over what time period do you expect to encounter duplicates? To detect duplicates, each
incoming NME must be compared in some way with all previous NMEs from some time period, for
example an hour, a day or a week. If you can limit the amount of time over which this comparison
is performed, you can improve performance. See also the aging mechanism described for each
rule below.
l Can you tolerate false duplicates? Rules that use only a hash of NME attribute values can
potentially declare false positives. If you cannot tolerate false duplicates, use a rule that
compares actual NME attribute values.
l What are your performance requirements? Knowing these will help you test various rules to
determine which rule meets your performance requirements.
l If a system or collector goes down, do you need to save the information about past NMEs for
duplicate detection? See the recovery information characteristics for each rule below.
DuplicateNMEDetectorRule
The DuplicateNMEDetectorRule detects duplicates by computing a hash code for the key NME
attributes of each NME and checking for hash code collisions. These NME attributes are used to
generate a CompositeAttributeKey for each NME. These CompositeAttributeKeys are stored in a
hash map. Every new NMEs attributes are compared with the attributes in the hash map. This hash
map is allowed to grow to a maximum configured size of 2^30 keys. The larger the configured
cache, the larger the memory allocated to the JVM since the collector stores all the NMEs in
memory. Ideally the number of NMEs used to detect duplicates by this rule should be 1000 NMEs or
less.
This is a relatively quick and simple rule. The incoming NME is checked only with the last n NMEs
which are processed by the rule. Only the last n NMEs are cached and the remaining are aged from
memory and not considered for duplicate detection. This is most suitable in scenarios where the
number of NMEs is relatively small.
Recovery
During a flush, all the CompositeAttributeKeys are written to the recovery file. This is used as
recovery information when the collector is restarted. Since a lot of information is written into the
recovery file, the recovery files tend to be large.
Aging Mechanism
The rule has an aging mechanism whereby it removes the oldest entries from the hash map when
the number of entries becomes larger than the configured cache size.
DuplicateCDRDetectorRule
The DuplicateCDRDetectorRule detects duplicates by computing a hash code for the key NME
attributes of each NME and checking for hash code collisions. The rule also provides a configurable
attribute called CompareKeyAttributes which indicates that the key NME attributes are to be
compared when a hash code collision occurs. This makes the duplicate detection by this rule
accurate. The hash codes are 64-bit values computed from a combination of CRC32 and Adler32
algorithms. Only these hash codes are stored in memory. The actual NME attributes are persisted in
the database during each flush. If the CompareKeyAttributes is set (which is required for accurate
duplicate detection), the attributes corresponding to the hash key must be queried from the
database and compared. Since the database must be queried for each hash code collision,
processing time of the rule can be high.
A percentage of the NMEs can also be stored in a cache in memory by configuring the
InMemoryPercentage attribute. This will ensure that a percentage of all NMEs will be held in memory
even after a flush so that the attribute comparison may not require a database query.
The DuplicateCDRDetectorRule can be used where accuracy has higher priority. Performance may
be slower because of the database querying which is required for comparing the attributes on a
hash code collision. An advantage of using this rule is that it is possible to configure whether to
detect duplicates simply by hash code collisions (which means there could be false duplicates
detected) or to do a comparison of the actual NME attribute values.
Recovery
Since the NMEs are stored in a database, no other recovery mechanism is necessary.
Aging Mechanism
The aging mechanism stores the hash keys in memory in a hash map until an aging limit, after which
they are removed from memory and no longer considered for duplicate detection. If aging is based
on time (as opposed to the number of keys), the maximum aging period is 24 hours.
TimeHashDuplicateCDRDetectorRule
The TimeHashDuplicateCDRDetectorRule detects duplicates based on hash code collisions. A 32-bit
hash code is computed for the configured key NME attributes of each NME. The efficiency of this
rule lies in the way the hash codes are stored in memory. The NMEs EndTime attribute is used to
compute the time interval to which the NME belongs and the hash codes are stored in memory,
structured by time intervals. Up to a maximum of 15 intervals can be stored in memory at a time.
The advantage of the interval-based caching is that when an NME enters the rule for duplicate
detection, its hash code is compared only with the hash codes stored for the interval to which it
belongs. The TimeHashDuplicateCDRDetectorRule has a very good processing time and is much
faster than the other duplicate detector rules in processing large amounts of input data.
Since only 15 intervals are stored in memory at a time, the remaining intervals are persisted in key
store files. One key store file is created per interval. If an NME which belongs to an interval not
currently in memory enters the rule, the interval (if present on disk) is paged into memory after one
of the intervals in the memory is paged out to disk. This paging makes the disk and memory usage
more efficient.
This rule provides very quick detection of duplicates. The computed hash codes of NMEs are divided
according to the intervals to which they belong and stored per time interval. Only the time interval
to which the NME belongs needs to be checked for duplicate detection. Its disk and memory usage is
also optimal since only hash codes (computed from the key attributes) are stored. But the
disadvantage is that because it detects duplicates based only on hash code collisions and there is no
comparison check with the actual NME attribute values, it can potentially detect false duplicates.
This rule is only as efficient as the hashing algorithm that it uses.
actual NME attribute values. A deployment requiring accurate duplicate detection where false
duplicates cannot be tolerated should use the TimeIntervalDuplicateCDRDetectorRule, though the
time and memory requirements are slightly higher. For more details see the comparison table
below.
Another disadvantage of this rule is that it does not support roll-back on a purge after an interim
flush. An interim flush happens when there exists the maximum number of intervals (15) in memory
and none of these intervals is persisted. If an NME belonging to a new interval enters the rule, one of
the existing intervals in memory must be written out to make room for the new interval to be stored
in memory. The intervals are persisted without waiting for a collector flush. This is called an interim
flush. Since the intervals are persisted even before a collector flush, a purge of that file cannot roll
back the records which are already written out.
Recovery
All the intervals are written out to disk when the collector stops and recovery is done by loading
these interval files to memory on a collector restart.
Aging Mechanism
The aging mechanism in the rule involves deleting the key store files of the intervals which are older
than the aging period.
TimeIntervalDuplicateCDRDetectorRule
The TimeIntervalDuplicateCDRDetectorRule is an enhanced version of the
TimeHashDuplicateCDRDetectorRule. This rule generates a CompositeAttributeKey from the
configured key NME attributes of each NME, and compares this with the existing
CompositeAttributeKeys on a hash code collision. Since the actual NME attribute values are
compared in this rule, it makes the duplicate detection accurate.
This rule is very efficient because the NMEs are stored in memory on the basis of time intervals. The
NMEs EndTime is used to compute the time interval to which the NME belongs and the
CompositeAttributeKeys are stored in memory based on the time intervals. Up to a maximum of 15
intervals can be stored in memory at a time. The advantage of interval-based caching is that when
an NME enters the rule for duplicate detection, its hash code needs to be compared only with the
hash codes stored for the interval to which it belongs. But since the
TimeIntervalDuplicateCDRDetectorRule compares the NME attribute values as well, it is not as fast
as the TimeHashDuplicateCDRDetectorRule. Also, the CompositeAttributeKeys for each NME are
stored in memory and on disk, so the memory consumption and disk usage of the
TimeIntervalDuplicateCDRDetectorRule is more than the TimeHashDuplicateCDRDetectorRule.
Ideally, the interval length (which specifies the length of each interval stored in memory) should be
low (such as 30 minutes or 1 hour). This will ensure that the maximum hours of data stored in
memory at a time is 15 times the interval length.
Like the TimeHashDuplicateCDRDetectorRule, this rule uses a 32-bit hash code generated by a
CRC32 algorithm (either from a Java library or from an eIUM library). When a new NME comes into
the rule, it is compared only to the NMEs in the same time interval, so the comparison logic is much
faster and performance is better.
The biggest advantage of this rule over the TimeHashDuplicateCDRDetectorRule is that its duplicate
detection mechanism is accurate. Another advantage is that it allows roll-back on a purge after an
interim flush. An interim flush is when the maximum number of intervals (15) are in memory but
none of these intervals has been persisted. If an NME belonging to a new interval enters the rule,
one of the existing intervals in memory is written out to make room for the new interval to be
stored in memory. The intervals are persisted without waiting for a collector flush. This is called an
interim flush. But in this rule, the interim flush writes out temporary files rather than persisting the
intervals in permanent key store files. The temporary files are converted to permanent key store
files only on a collector flush. A purge on a file can roll back the records that have been persisted by
the interim flush.
This rule detects duplicates based on structured time intervals. It compares the hash codes of the
NME to the stored NMEs. In case of a collision, it also compares the key NME attribute values. It
provides accurate duplicate detection, but since the NME attributes have to be compared, they also
have to be stored. The memory and disk usage and the time taken for the rule to process an NME
are much more than the TimeHashDuplicateCDRDetectorRule.
Recovery
All the intervals are written out to disk when the collector stops and recovery is done by loading
these interval files to memory on a collector restart.
Aging Mechanism
The aging mechanism in the rule involves deleting of key store files of intervals older than the aging
period.
Duplicate Best used when Fast processing time Accurate for Depends on the
NMEDetectorRule the number of checking configured cache size,
NMEs for low since all the NMEs are
comparison is less numbers of stored in memory for
than 1000. NMEs duplicate detection.
The larger the
configured cache size,
the larger the memory
required.
TimeInterval Best used when Not as fast as TimeHash Very Memory requirements
DuplicateCDRDetectorRule duplicate DuplicateCDRDetectorRule Accurate are more than
detection is because the value of each TimeHashDuplicateCDR
required from a key NME attribute must be DetectorRule because
large number of compared and stored for the key NME attribute
NMEs. accurate duplicate values are stored to
detection. detect duplicates
correctly.
Performance Comparison
This section describes the results of performance tests using the duplicate detection rules. Use this
information to help you decide which rule will work best for your situation. The tests were
performed on IUM version 5.0 Feature Pack 1 with Java version 1.5. The collector was run on a
machine with the following hardware configuration:
Performance Statistics
Performance is the time taken by the rules to process the sample data. It is an average of the
aggregation rates to process each of the datasets.
DuplicateCDRDetectorRule 1288
TimeHashDuplicateCDRDetectorRule 1771
TimeIntervalDuplicateCDRDetectorRule 1423
Disk Usage
Rule Bytes Used
The factors that contribute to the usage of disk space in each rule are:
If the DuplicateCDRDetectorRule is used with the CompareKeyAttributes attribute set to true, then
it has much higher accuracy. The DuplicateNMEDetectorRule is also accurate, but it can be used only
to check for duplicates among a relatively small number of NMEs. Finally, the
TimeIntervalDuplicateCDRDetectorRule also has a much higher accuracy because it compares the
NME attribute values when a hash collision occurs. This is summarized in the following table.
Degree of Accuracy
Rule Less Accurate More Accurate
DuplicateNMEDetectorRule **
DuplicateCDRDetectorRule:
TimeHashDuplicateCDRDetectorRule **
TimeIntervalDuplicateCDRDetectorRule **
Recovery 91
Collector Components 96
Configure Collectors 97
The above figure shows four voice switches each generating CDR files stored locally on the switch.
Four leaf collectors are deployed to collect CDRs from the switches.
Voice CDR
Switches Files
Voice Switch
Leaf Collector
File
Service
The following figure below shows how a file service can read CDR files from multiple different
switches and direct the CDR files to specific collectors based on the switch type. For example, if you
have two switches from vendor A and two switches from vendor B, the file service can direct the CDR
files from vendor As switches to one collector and the files from vendor Bs switches to another
collector.
Voice CDR
Switches Files
Vendor A
Voice Switch
Leaf Collectors
Vendor A
File
Consolidator
Service
Vendor B
Vendor B
l Lets you make optimal use of hardware (CPU and memory) and software by reducing the number
of collectors required to process your data.
l The file service separates file collection from file processing. If the voice network goes down, the
collector continues to process files in the file service. If the file service goes down, when it comes
back up it continues collecting and processing files where it left off. If the collector goes down,
the file service continues collecting files from the voice switches and continues distributing the
files to the collector when it comes back up.
l You can reconfigure file collection and file processing separately when, for example, you upgrade
your voice switches.
l You can direct files from specific switches to specific collectors.
l With upcoming scheduling policies, youll be able to configure load balancing by directing CDR
files to less busy collectors.
File
Service
File File
Collection Distribution
Service Service
The following sections describe the component structure of the file collection service and the file
distribution service.
NOTE: The file collection service, the file distribution service and all leaf collectors reading files
from the file distribution service may be running on the same or on different eIUM host systems
in a deployment.
NOTE: The StreamSource must be a file-based source, such as FTPSource or FileSource. You can
read CDR files from voice switches that use the FTAM protocol with the RemoteCommandSource
and HPUXFTAMCommandSourceDriver components. Other kinds of sources such as TCPSource
and UDPSource are not supported.
The StreamSource typically needs a FileRollPolicy configured under it to specify how the files are
named and where they are located. For example, a DirectoryPolicy specifies a directory path where
input files are located.
See "Configuration Structure of the File Service" (on page 92) for details on the configuration of
these components.
See "Configuration Structure of the File Service" (on page 92) for a description of where the
JobReceiverFileRollPolicy fits in a collector.
Next the file collection service passes the file to the file distribution service, which becomes the new
owner.
Finally, the file distribution service passes the file to one particular collector and the collector
becomes the new owner. As with all eIUM collectors, the collector is responsible for the cleanup of
the CDR file after it has processed the file. See the cleanup handlers in the eIUM Component
Reference for available cleanup handlers.
After the collector has finished processing the file, it removes the information about the file from
the notification table. The file distribution service does not clean up or remove the file.
Recovery
The file service implements recovery similar to other eIUM components.
If the collector stops in the middle of processing a file, when it restarts it will reprocess that file
since it had not flushed any data from that file. The file collection service continues fetching files
and sending them to the file distribution service. The file distribution service queues the files until
the collector restarts.
If the file collection service stops, it uses its recovery information to refetch any files it was in the
middle of fetching. Then it continues fetching files as configured. The file distribution service
continues sending files it has to the collectors.
If the file distribution service stops, the file collection service continues fetching files and just holds
them. The collectors cannot process any more files until the file distribution service restarts.
NOTE: This section describes most but not all the file service components. See the eIUM
Component Reference for complete details on all components. See also the eIUM Template
Reference and the file service templates for complete, working examples of these components.
The figure below shows a file collection service with two File Collectors.
Another example is if each switch reuses the same file rather than generating new files. For
example, a switch might writes CDRs to the file CDRFILE. When the mediation system reads the file,
the switch simply reuses the same file. When the file service reads the file, it could add a sequence
number to the file name to make it unique.
The example below shows a File Collector with a RenameFilePreprocessor that can prepend or
append a string on each file name, or provide a completely new file name to each input file. The
The StreamSource is an FTPSource, indicating the file collection service fetches CDR files from the
switch via FTP. The FTPSource uses a DirectoryPolicy, indicating it fetches all files from the specified
directory on the voice switch, after possibly applying file name filters.
If you had more than one collector, the file distribution service would configure multiple Collector
Resource nodes under the Collector Manager as shown below.
You can also specify that files from a switch go to any of a group of collectors. The following shows a
Collector Manager that sends files from switches 03, 04 and 05 to either collector CollC or CollD,
whichever is available next.
Collector Components
The following diagram describes the specific encapsulator components in a collector that reads CDR
files from a file distribution service. The rest of the collector, the aggregator and datastore, are no
different from any other collector. Notice that the JobReceiverFileRollPolicy specifies the same
notification table name as specified in the JobManager of the file distribution service. For complete
details on the JobReceiverFileRollPolicy, see the eIUM Component Reference.
Configure one File Collector for each switch in your file collection service.
Do you need to identify which switch each file came from? If so, use a preprocessor to mark each
file. For example, the preprocessor could rename each file to include a string indicating the origin
switch.
How frequently does the file collection service need to fetch CDR files from each switch? To answer
this question, for each of your switches determine the following:
Determine how to partition CDR files among collectors. For example, if you have ten voice switches
and two collectors, you might send CDR files from switches one through five to the first collector
and files from switches six through ten to the second collector.
Configure the mapping of CDR files to collectors using the SourceResourceMapping attribute of the
ResourceManager component.
Configure Collectors
Finally, configure the collectors that will ultimately process the CDR files from the file distribution
service. Use the JobReceiverFileRollPolicy in the collectors encapsulator.
1. In the Launchpad, select the Tools -> Deployment Builders -> Create File Service Components
menu item. This displays the File Service Wizard screen as shown below.
File Service Select the eIUM host where the file service is to run.
Host
FTP Select FTP if the file collection service is to fetch files using FTP.
Stream Select Stream if the file collection service is to fetch files using any method
other than FTP, such as local files.
How Many Enter the number of input devices the file collection service is to fetch files
Sources? from. For example, if you have 25 voice switches, enter 25.
How Many Enter the number of eIUM collectors that will process the input files. (On a later
Collectors? screen you will map input sources to collectors.)
2. Click the Next button. If you selected FTP as the file transfer mechanism, this displays the
following screen. If you selected Stream as the file transfer mechanism, skip to step 3.
NOTE: In this step, you will configure one FTP server. All the input FileCollectors will be
configured with the same FTP server information. Later you will need to edit each
FileCollector to refer to the proper FTP server.
Enter the following information and then skip step 3 and go to step 4.
File Service Wizard Screen 1.1, FTP Server Setup
Input Field Description
FTP Server Enter the name of the FTP server where files will be retrieved
from.
User Name Enter the user name to authenticate to the FTP server.
Remote Source Enter the directory where files are located on the remote device.
Directory
Local Cache Directory Enter the directory on the local host where the files are to be
placed.
3. If you selected Stream as the method of reading input files, enter the directory where the files
will be located. If you are using some other method of retrieving files, enter any text that will
help you find this location in the configuration for easy editing later.
4. Click the Next button. This displays the File Service Collector screen as shown below.
Specify the information described below in the File Service Collector screen.
Collector Enter the name to be used for all collectors that are to read and process files
Base Name from the file distribution service. The wizard will create the number of
collectors you specified in the first screen where you specified how many
collectors you want. It appends a number on the name you specify here to
distinguish each of the collectors and give them unique names.
Notification Enter the name of the database table to be used for notifications between the
Table file collection service, file distribution service and collectors. For more
Name information see "The Notification Table" (on page 90).
5. Click the Next button to display the Update Configuration screen as shown below.
Verify the information you entered. Use the Previous button to go back and correct anything.
6. Click the Next button to display the final screen.
7. Click the Finish button to exit the wizard. Continue with "Examine and Modify Your File Service"
(on page 102).
NOTE: You can edit your file service any time by double clicking on it in the Launchpad, or by right-
clicking on it and selecting the Edit menu item, or by selecting it and selecting the Actions -> Edit
menu item.
You can also use the Deployment Editor to modify the file service.
1. Open the file collection service. Open each input data source and modify them as needed. For
example, you will most likely have to modify the RemoteFileSource and the FileRollPolicy.
2. Open each collector created by the file service wizard. You will most likely need to modify the
encapsulator and parser. The default aggregator simply has a StoreRule, so add your business
logic to the aggregator.
3. Open the file distribution service. Use the source to collector mapping screen to assign the files
from each of the Available Sources to one or more Destination Collectors. Each available input
file source can be mapped to one or more collectors. The Selected Sources box shows which
Available Sources are mapped to the displayed Destination Collector.
Check the statistics in a similar way for the file distribution service to make sure it is sending files to
the appropriate collectors. Check the collectors to make sure they are receiving files from the file
distribution service and processing them correctly.
In the Launchpad, select the file collection service or file distribution service, then right-click to bring
up the menu. Or select the file collection service or file distribution service, then select the
appropriate Launchpad menu item.
l Files Collected - The total number of files collected by the file collection service since startup.
l The following statistics for each individual input data source:
n Data Source - The name of each input data source from the file collection service
configuration.
n Files Collected - The number of files collected from each input data source since file collection
service startup.
n Last File Name - The name of the last file collected from each input data source.
n Last File Time - The time the last file was collected from each data source.
NOTE: If a data source is deleted after the file collection service is started, all statistics regarding
that data source continue to display until the file collection service is restarted.
l Files Distributed - The total number of files distributed by the file distribution service since
startup.
l The following statistics about each file distributed from each input source to each output
collector.
n Datasource - The name of each input data source from the configuration.
n Queued - The total files from each source that are ready for distribution to the next available
collector.
n Distributed - The total files distributed from each source to all configured resources.
n Collector Name - The number of files distributed from each input source to each collector.
NOTE: After the file distribution service is started, if you change the source resource mapping or
if you delete any of the sources or resources, statistics pertaining to these are not reset until the
server is restarted.
l Use the jcscontrol command to start, stop, delete and get the status of a file collection service
or to clean up an individual file collector.
For example, the following configuration shows part of a file collection service named SampleFCS
that defines two file collectors, named FileCollector1 and FileCollector2 that correspond to the
two input sources named host1 and host2:
[/deployment/host/SampleFCS]
ClassName=FileCollectionServiceProcess
JobCollectors=host1,FileCollector1
JobCollectors=host2,FileCollector2
The following example will attempt to start the file collector named FileCollector2 in the file
collection service named SampleFCS:
jcscontrol -n SampleFCS -s host2 -c start
l Use the jcscleanup command to clean up a file collection service, similar to how the siucleanup
command cleans up a collector.
The following example cleans up a file collection service named FCS1:
jcscleanup -n FCS1
l Use the jdscontrol command to dynamically change how files are distributed by a file distribution
service. With the jdscontrol command you can assign collectors to process files collected from a
source, stop collectors from processing files from a source, add new data sources and remove
existing data sources. These changes become effective without restarting the file distribution
service.
For example, the following configuration shows part of a file distribution service named
SampleFDS that maps two sources named DataSource1 and DataSource2 to two resources
(collectors) named SampleFDSCollector1 and SampleFDSCollector2. Files from DataSource1 are
sent to SampleFDSCollector1 and SampleFDSCollector2. Files from DataSource2 are sent only to
SampleFDSCollector1.
[/deployment/host/SampleFDS]
ClassName=FileDistributionServiceProcess
...
[/deployment/host/SampleFDS/ResourceManager]
ClassName=CollectorManager
SourceRe-
sourceMapping=DataSource1,SampleFDSCollector1,SampleFDSCollector2
SourceResourceMapping=DataSource2, SampleFDSCollector1
The command below will attempt to create the following SourceResourceMapping configuration
attribute that sends files from DataSource3 to SampleFDSCollector3:
SourceResourceMapping=DataSource3,SampleFDSCollector3
jdscontrol -n SampleFDS -s DataSource3 -r SampleFDSCollector3 -c
addSource
l Use the jdscleanup command to clean up a file distribution service, similar to how the siucleanup
command cleans up a collector.
The following example cleans up a file distribution service named FDS1:
jdscleanup -n FDS1
See the eIUM Command Reference for complete details about these and all eIUM commands.
l The encapsulator reads the input data and places the data into a Normalized Metered Event or
NME, the data record format used by all eIUM components.
l The aggregator processes the NME data.
l The datastore stores the NME data and formats it for use by other collectors or applications.
You can configure a Data Delivery Agent as part of your datastore to push each flush of NME data
to an external application, such as a billing system, rating system, data control point or service
control point.
l Use a data delivery agent under an IDRJDBCDatastore to deliver IDR files to an application.
l Use a data delivery agent under a FileJDBCDatastore to deliver NMEs to an application.
The Data Delivery Agent includes the following components:
l DeliveryFTP sends IDR files from an IDRJDBCDatastore to an FTP server. See "FTP Data Delivery"
(on page 113).
l DeliveryNMEAgent extracts NMEs from the binary datastore files of a FileJDBCDatastore and
sends them to any component that implements the UsageSendChannel interface, for example
the DeliveryJDBC component. See "JDBC Data Delivery" (on page 114).
l DeliveryJDBC sends NMEs to a JDBC-compliant database. See "JDBC Data Delivery" (on page 114).
Whenever the aggregator flushes NMEs to a datastore that has a configured Data Delivery Agent,
the following happens:
Since every aggregation scheme flushes data to the datastore, every aggregation scheme can have
one or more DeliveryAgents, as shown below. However, if writing to a database, make sure each
delivery agent updates a different table to avoid concurrency issues.
The following table summarizes the Delivery Agent and related components.
Application Interface
Datastore Types Delivery Agent Components Components
When Audit is enabled on a collector, an NME channel may be used to collect the Audit information
for that collector. By specifying the audit scheme name (AUDIT_DS or AUDITSRC), audit information
may be collected.
NMEChannel may also be used to send eIUM metadata, such as audit, to a remote audit archive
server or application (for example, revenue assurance analysis). The general metadata, with or
without auditing, is always available and may always be sent with its associated usage data for
every flush. Source and input audit data (which includes the audit exception list) exists only when
audit has been enabled; data delivery on source and input audit sets will fail if audit is disabled. Data
delivery for source and input audit sets can be configured by specifying their scheme names
(AuditSrc and Audit_DS, respectively) in the DeliveryAgent attribute.
This component should only be configured when the datastore is a FileJDBCDatastore, or for Audit
schemes.
The following diagram shows the structure of the configuration of these components for an NME-
based data delivery mechanism.
NOTE: The siucleanup command does not affect the destination of NMEs or files from the
DeliveryAgent. You are responsible for cleanup and aging of the data in the destination.
Recovery Behavior
With every file or NME the delivery agent sends, it waits for confirmation that the delivery was
received. If the collector goes down, it resends any data that was sent but not yet confirmed.
[/deployment/<host>/<collector>/Datastore/<deliveryAgentNode>]
[/deployment/<host>/<collector>/Datastore/<deliveryAgentNode>/<transportNode>]
[/deployment/host01/FileDemoCollector/Datastore]
ClassName=FileJDBCDatastore
...
DeliveryAgent=myDA1,scheme1
[/deployment/host01/Demo/Datastore]
ClassName=IDRJDBCDatastore
IDRType=FixedWidth
DeliveryAgent=deliveryAgent,scheme1
...
The DeliveryFTP component handles the file delivery from eIUM to a specified FTP host running an
FTP server. The user and password is specified in the configuration, and used to establish a
connection to the server. The files will be sent to a specified directory on the server.
Additional characteristics of the FTP transport can be specified. For example, if the file should be
cached before being delivered to the final destination, a temporary directory can be specified that is
used for the file transfer. After the transfer has completed successfully, DeliveryFTP will use the FTP
rename command to move the file to its final destination. The reason this is typically done is to
provide an atomic operation (on most operating systems, the rename will not be interrupted) for
the file delivery. This prevents any other operations from being performed before the file transfer is
complete.
Connection time-out control is also possible, allowing the connection to be automatically broken for
each delivery (flush), or to attempt to maintain the connection during the collector session.
[/deployment/<host>/<collector>/Datastore/<deliveryAgentNode>/<deliveryFtp>]
[/deployment/host01/Demo/Datastore]
ClassName=IDRJDBCDatastore
IDRType=FixedWidth
DeliveryAgent=deliveryAgent,scheme1
...
eIUM normalizes CDRs or any other input data into NMEs (Normalized Metered Events). All eIUM
components understand and operate on NMES. NMEs contain not only the data from the CDR, but
also the hierarchical structure of the data and information about which data fields are set. When
you define your NMEs, you can specify which data fields are optional which helps facilitate data
validation. NMEs are a powerful data structure that let you efficiently perform your business logic
and support your business applications.
This topic series describes how to use structured NMEs to read and process complex hierarchical
CDRs.
NMEAdapters 120
Namespaces 125
Example 130
Example 131
Overview of NMEs
NMEs, or Normalized Metered Events, are the internal data structure used by all eIUM components.
All data read and processed by eIUM are converted to NMEs. All components previous to the IUM 4.5
Feature Pack 2 release used traditional NMEs. As of IUM 4.5 Feature Pack 2, IUM uses structured
NMEs and several new components that operate on structured NMEs and enable interoperability
with existing NMEs and with all existing components. This section describes both traditional NMEs
and structured NMEs and shows how you can use them to implement your mediation solution.
Traditional NMEs are defined by the NME schema and the parser component. The NME schema is a
data dictionary that defines all the possible fields of the data record. For traditional NMEs, the NME
schema refers to the list of name, type pairs defined for an eIUM deployment. Each name is a
user-defined string and each type is a basic data type like integer, string, time, IP address and so
forth. In the NME schema, the types are IntegerAttribute, StringAttribute, TimeAttribute,
IPAddressAttribute and so forth. These name, type pairs are defined in configuration at the
configuration node /NMESchema and loaded automatically into the configuration server. For
example, the following shows a few NME attributes defined in the NME schema:
[/NMESchema]
Attributes=Type,com.hp.siu.utils.IntegerAttribute
Attributes=StartTime,com.hp.siu.utils.TimeAttribute
Attributes=EndTime,com.hp.siu.utils.TimeAttribute
Attributes=SrcIP,com.hp.siu.utils.IPAddrAttribute
Attributes=DstIP,com.hp.siu.utils.IPAddrAttribute
Attributes=SrcPort,com.hp.siu.utils.IntegerAttribute
...
NME records themselves are composed of one or more of these name, type pairs that are
assembled into an NME. The parser typically lists the NME attributes contained in the NME.
The figure below shows a traditional NME comprising eight data fields, or NME attributes. The NME
attributes are of various types: time, IP address, integer (32 bits) and long (64-bit integer).
All eIUM components previous to the IUM 4.5 Feature Pack 2 release support traditional NMEs. The
IUM 4.5 Feature Pack 2 release and later continues support for traditional NMEs, but it also adds
structured NMEs.
Structured NMEs
Structured NMEs are a substantial improvement over traditional NMEs.
l Structured NMEs store complete information about the hierarchical arrangement of complex
data records.
l Structured NMEs contain information about which data fields have been set and which have not.
l Structured NMEs can handle optional data fields.
Structured NMEs retain all the hierarchical information of structured data. For example, the
following shows a structured NME that consists of an NME and a sub-NME:
The top level NME consists of four NME attributes: CreateTime, NumRecord, FileName and Data.
The NME attribute named Data is actually a logical reference to another NME sometimes called a
sub-NME. The sub-NME consists of eight NME attributes: StartTime, EndTime, SrcIP and so forth.
A slightly more complex structured NME is shown in the diagram below. This structured NME has the
same basic structure, but in this case the sub-NME is actually an array of three NMEs:
Structured NMEs were introduced in the IUM 4.5 Feature Pack 2 release. Several components were
also introduced that work on structured NMEs and enable interoperability with all traditional eIUM
components.
NMEAdapters
eIUM implements structured NMEs in NMEAdapters. NMEAdapters are a new type of NME that
contains both a traditional one-dimensional NME part the same as NMEs in all previous versions of
eIUM, plus a structured NME part that contains arbitrarily complex hierarchical data such as that
commonly found in voice CDRs. The traditional NME part contains a hidden pointer to the structured
NME part. The diagram below shows an NMEAdapter and how it consists of a traditional NME part
and a structured NME part:
Note that the traditional NME part contains a Hidden Pointer that points to the structured NME
part. This hidden pointer connects the traditional NME part to the structured NME part and enables
interoperability between traditional NMEs and structured NMEs.
Operating on NMEAdapters
All existing eIUM components operate on the traditional NME part and are unaware of the hidden
pointer and the structured NME part. New components that operate on NMEAdapters can operate
on both the traditional NME part and the structured NME part.
To operate on structured NMEs, you must use components that are aware of and operate on
NMEAdapters. The following are some of the components that operate on NMEAdapters.
For structured NMEs, you must define structured NME types in a separate configuration entry and
you must configure the NMESchemaLoader component to load them. The NMESchemaLoader is a
component you configure as part of your collectors. The NMESchemaLoader reads structured NME
type definitions from the configuration and loads them into the NME schema.
For more information, see "Defining Structured NME Types" (on page 123) and "Loading NME Type
Definitions" (on page 130).
Encapsulators
Encapsulators that work with NMEAdapters read structured data and generate a structured NME in
an NMEAdapter. All other encapsulators generate traditional one-dimensional NMEs. Below are
some of the encapsulators that generate NMEAdapters. For more information on these
components, see the eIUM Component Reference.
l BERFileEncapsulator reads ASN.1 data encoded in BER format, generates an NMEAdapter and
places the data into the NMEAdapter.
l NortelUMTSEncapsulator reads Nortel UMTS version 3.0 format data files, generates
NMEAdapters and places the data into the NMEAdapters.
l SNMEReaderFactory is used with the NMEFileEncapsulator to read structured NMEs from binary
files created by a FileJDBCDatastore and an SNMEWriterFactory. That is, the
NMEFileEncapsulator and SNMEReaderFactory components together read structured NMEs from
a FileJDBCDatastore and generate NMEAdapters.
Rules
Traditional rules work with traditional NMEs but can also work with the traditional NME part of
NMEAdapters. Some of the rules and related components that work with the structured NME part of
NMEAdapters are listed below. For more information on these components, see the eIUM Component
Reference.
l NMEConversionRule works with NMEAdapters and copies attribute values from the structured
NME part to the traditional NME part, or vice versa. This rule is like the AdornmentRule in that it
copies NME attribute values. In addition, this rule can convert a traditional NME to an
NMEAdapter and add a structured NME part. In this case, it can also copy data values from the
traditional NME part to the structured NME part.
The NMEConversionRule is essential because there are not many rules that work with
NMEAdapters, and the NMEConversionRule enables you to use the full set of existing rules with
NMEAdapters. By copying the data from the structured NME part to the traditional NME part, all
existing eIUM rules can operate on the data in the traditional NME part of the NMEAdapter. After
these rules implement your business logic, you use the NMEConversionRule once again to copy
the data values from the traditional NME part to the structured NME part.
l SplitArrayRule works with NMEAdapters and splits an array of sub-NMEs in the structured NME
part into separate individual NMEs. It sends each of the split NMEs to the rule following the
SplitArrayRule. This allows you to process each NME in an array of NMEs separately. Alternatively,
you can define a side rule chain. This rule sends each of the split NMEs to the side rule chain,
then sends the full NME (as modified by the side rule chain) on to the rule following the
SplitArrayRule.
l SNMEValidationCheck is a condition of a FilterRule or a ConditionalRule that checks whether all
required attributes in a structured NME are set. It validates the structured NME part of an
NMEAdapter. If all the required attributes of the structured NME are set, this component returns
a value of true. If any required attribute is not set, this component returns false.
You must explicitly designate NME attributes as optional in the structured NME type definition. By
default, NME attributes are required to be set. Required NME attributes are all those not
designated optional in the NME type definition in the NME schema.
Use the SNMEValidationCheck as a condition to a FilterRule or a ConditionalRule. To configure
this component with a FilterRule or ConditionalRule, you must configure it as a subcomponent of
the rule and name the configuration subnode Condition. See the FilterRule and the
ConditionalRule in the eIUM Component Reference for more information.
Datastores
Traditional datastores store traditional NMEs. To store NMEAdapters, use a FileJDBCDatastore
along with an SNMEWriterFactory to write NMEAdapters to the datastore. That is, the
FileJDBCDatastore and the SNMEWriterFactory together write structured NMEs to a datastore. The
FileJDBCDatastore stores data in binary files.
You must use an NMEFileEncapsulator with an SNMEReaderFactory to read structured NMEs from
the binary files created by the SNMEWriterFactory. For more information on these components, see
the eIUM Component Reference.
Key Points
Below are the key points you need to know about NMEAdapters. Keep these in mind as you begin
working with NMEAdapters.
l GSM - Ericsson R10 MSC (structured NME support) - This is a template for a collector that
parses MSC charge data records from BER-encoded ASN.1 files produced by Ericsson AXE-10 R10
exchanges.
l GSM - Ericsson R9 MSC (structured NME support) - This is a template for a collector that parses
MSC charge data records from BER-encoded ASN.1 files produced by Ericsson AXE-10 R9
exchanges.
l GSM - Ericsson TAP3 Roaming (structured NME support) - This is a template for a collector that
parses TAP3 records from BER-encoded ASN.1 files produced by Ericsson AXE-10 exchanges.
Traditional eIUM NMEs are flat data records with no hierarchical information. They are defined in the
NME schema and in the parser component, as described in Traditional NMEs and the NME Schema
on page 171.
Structured NMEs are data records that include hierarchical information, such as arrays and
subrecords. Structured NMEs can also contain information about which data values have been set
and which data values are optional. You can use this information to validate the incoming data.
Structured NME types define a record structure. The structure can consist of any of the following
four elements:
l Primitive types, which are boolean, byte, short, int, long, char, float and double as defined in Java.
l Other NME types.
l Array types, which are sequences of primitive types or sequences of other NME types.
l String type, which is a predefined array of chars.
You define structured NMEs in the NME schema configuration. The NME schema has three kinds of
entries. The first two, name spaces and type aliases, define names that help organize and simplify
your structured NME definitions. The third type, NME types, actually defines your structured NME
records.
l Name spaces define a unique naming context. Name spaces contain one or more type aliases
and one or more NME types.
l Type Aliases define additional names for types.
l NME types define the NME attributes and the record structure of your structured NMEs.
All these entries are stored in the configuration server, typically under the /SNMESchema
configuration node. Here is an example of a simple structured NME schema:
[/SNMESchema]
[/SNMESchema/HP_IUM]
TypeAliases=Port,int
[/SNMESchema/HP_IUM/MyNMEType]
Attributes=StartTime,Time
Attributes=EndTime,Time
Attributes=SrcIP,IPAddress
Attributes=DstIP,IPAddress
Attributes=SrcPort,Port,optional
Attributes=DstPort,Port,optional
Attributes=NumBytes,long
Attributes=NumPackets,int
The following diagram shows this NME schema as it appears in the Launchpad. The Launchpad
illustrates the structure more visibly.
Notice that this structured NME is actually a single-level structure that could be defined with
traditional NMEs. The next example shows more structure.
The types Time and IPAddress are predefined type aliases and are defined as 32-bit integers. See
"Type Aliases" (on page 126) for more information.
Note also that SrcPort and DstPort are marked as optional attributes. This can be used by the
SNMEValidationCheck to find out if any non-optional attributes were not set. See the
SNMEValidationCheck in the eIUM Component Reference for details.
Namespaces
The structured NME schema can have one or more namespaces. Each is configured as a sub-node
under the root NME schema node, typically /SNMESchema. The name of the sub-node is the name
of the namespace and must be unique. Valid names must start with a letter, and consist of letters,
numbers, the $ or _ characters. White space and . are not allowed.
Under each namespace you can define type aliases and NME types that belong to that namespace.
For example, the following shows an NME schema that has three namespaces:
[/SNMESchema/VoiceNameSpace]
...
[/SNMESchema/MobileNameSpace]
...
[/SNMESchema/IPNameSpace]
...
Type Aliases
Type aliases simply give another name to an existing type. You can only define type aliases on
primitive types or previously defined type aliases in the same namespace. You cannot define aliases
on NME types, on array types, or on types in another namespace.
Use aliases to make your NME type definitions clearer and easier to read. You define a type alias in a
namespace with the attribute TypeAliases under a particular <Name space> node. The TypeAliases
attribute is optional and multi-valued.
The deployment editor diagram in "Syntax of NME Type Definitions in the NME Schema" (on page
124) shows a type alias named Port that defines another name for the type int. The NME attributes
SrcPort and DstPort use this type alias. This type alias is defined in the HP_IUM name space and can
be used by any attribute in the namespace.
Syntax
The syntax for type aliases is as follows:
TypeAliases=<Alias name>,<Existing type>
<Existing type> is the name of a primitive type or alias in the same name space.
Once an alias is defined, you can use it to declare attributes. If the attribute is in the same name
space, just use the alias directly. For example, the following declares usage to be another name
for int:
TypeAliases=usage,int
The following defines the NME attribute NumBytes to be of type usage, which is an integer:
Attributes=NumBytes,usage
If the alias you want to use is in another name space, use the qualified name of the type alias by
prepending its name space as shown below.
Attributes=NumBytes,<name space>:usage
For example, if the alias usage were defined in the name space mobile, you would use the
following to define an NME attribute:
Attributes=NumBytes,mobile:usage
NOTE: It is not recommended that you overwrite factory predefined type names as this can be
error prone, difficult to maintain and confusing to read. However, if a factory predefined alias is
overwritten and you want to define an attribute with the original factory definition, prepend a
colon (:) in front of the alias. For example, if Time is redefined as a long in your name space, to
declare an attribute with the original factory definition which is int, use
attributes=StartTime,:Time.
A qualified name of an NME type is of the format <name space>:<name>. Using this format, you
can uniquely identify any NME type across all name spaces. In the deployment editor diagram in
"Syntax of NME Type Definitions in the NME Schema" (on page 124), the qualified name of
MyNMEType is HP_IUM:MyNMEType.
Each NME type configuration node has only one configuration attribute called Attributes that
defines the list of attributes in NMEs of that type. It is a required attribute and can be multi-valued.
<Attribute name> is the user-defined name you give to the data field in the NME.
<Attribute type> is the type you assign to the data field corresponding to the type of the
incoming data.
The third parameter specifies that the attribute is optional. This can be used for validation of the
input data, for example by the SNMEValidationCheck. If the attribute is required, leave off the third
parameter.
To define an attribute you can use any of the following for <Attribute type>:
l Primitive types. These are defined by eIUM, for example boolean, int, byte, short char, long, float,
double, and string, as well as the array form which is just the primitive type followed by the []
array notation. See "Primitive NME Attribute Types" (on page 127).
l Types defined by type aliases. These are defined in your NME schema by the TypeAliases
attribute. You can also use one of the eIUM predefined type aliases. See "Predefined Type
Aliases" (on page 127).
l Another NME type. These are defined in your NME schema.
l An array of another NME type. These are any NME type definition followed by the [] array
notation.
Using these NME types, you can form an NME type representing structured data records. If the
referenced NME type is in the same name space, you can refer to it by its simple name or by its
qualified name. If the NME type belongs to a different name space, you must use the qualified
name.
NOTE: A circular dependency can occur when NME types declare attributes as other NME types.
When this happens, the NMESchemaLoader is able to detect and log this situation, and the
NMETypes that contributed to the circular dependency are not added into the NME schema.
Check the collector log file for possible messages.
[/SNMESchema]
[/SNMESchema/HP_IUM]
TypeAliases=Port,int
[/SNMESchema/HP_IUM/MyNMEType]
Attributes=StartTime,Time
Attributes=EndTime,Time
Attributes=SrcIP,IPAddress
Attributes=DstIP,IPAddress
Attributes=SrcPort,Port,optional
Attributes=DstPort,Port,optional
Attributes=NumBytes,long
Attributes=NumPackets,int
[/SNMESchema/HP_IUM/MySummaryType]
Attributes=CreateTime,Time
Attributes=NumRecord,int
Attributes=FileName,string
Attributes=Data,MyNMEType[]
The following is how this structured NME type definition appears in the Launchpad.
This example defines two NME types, MyNMEType and MySummaryType. MyNMEType is defined as in
the deployment diagram in "Syntax of NME Type Definitions in the NME Schema" (on page 124).
MySummaryType contains four elements. The first three are simple elements of type Time, integer
and string. The fourth element, Data, is actually an array (indicated by the [] notation) of NMEs
(indicated by the type specified as MyNMEType). This schema defines a hierarchical data record as
show in the following diagram:
If an incoming data record contained an array of three subrecords, the structured NME would look
like the following diagram:
Example
The following is an example of a collector that loads and uses a structured NME. Notice that rather
than explicitly defining the NME schema under the /mySNMESchema subnode, it uses a Link
attribute that refers to the /SNMESchema node. See "Linked Collectors" (on page 53) for details
about using links.
[/deployment/host01/myCollector/snmeloader/mySNMESchema]
Link=/SNMESchema
To refer to the individual fields (NME attributes) of the structured NME part of an NMEAdapter, use
the following notation:
<NME attribute>.<sub-NME attribute>
Use the following notation for NME attributes that are arrays:
<NME attr>.<sub-NME attr>[<index>]
Example
For example, the following shows a structured NME type definition:
[/SNMESchema/Namespace/NMEtype1]
Attributes=StartTime,Time
Attributes=EndTime,Time
Attributes=Data,UsageRecord[]
[/SNMESchema/Namespace/UsageRecord]
Attributes=SrcPort,int
Attributes=DstPort,int
Attributes=NumBytes,int
The first or top-level NME, NMEtype1, contains three attributes: StartTime, EndTime and Data.
StartTime and EndTime are of type Time, which is a time stamp. The Data attribute is actually an
array of NMEs of type UsageRecord. The NME type UsageRecord contains three attributes: SrcPort,
DstPort and NumBytes, all of type int, which is a 32-bit integer. If an incoming data record contained
only one UsageRecord, it would look like this:
If an incoming data record contained three UsageRecords, it would look like this:
You would refer to the NumBytes attribute in the third row of UsageRecord as follows:
Data[2].Numbytes
The structured NME part of the NMEAdapter is defined in the NME schema and loaded by the
NMESchemaLoader component. For details, see the NMESchemaLoader in the eIUM Component
Reference.
If you do not need to keep the structure of the input data, you can use traditional NMEs.
If your input data is not structured, that is, if it consists of simple one-dimensional records, you can
use traditional NMEs. However, even in this scenario you can create NMEAdapters from the
traditional NMEs with the NMEConversionRule.
l You can add a collector after your last collector that simply converts your data to NMEAdapters
and sends the data to your business application. This new collector would read traditional NMEs
from another collector, use the NMEConversionRule to convert the NMEs to NMEAdapters and
copy the data to the structured NME part.
l You can insert an NMEConversionRule into an existing rule chain to create an NMEAdapter and
copy data values to either part of the NMEAdapter. Subsequent rules operate on the traditional
NME part of the NMEAdapter. Replace the datastore with a FileJDBCDatastore and
NMEWriterFactory to save the NMEAdapters in the datastore. Subsequent collectors must use
the NMEFileEncapsulator and NMEReaderFactory to read NMEAdapters and the
FileJDBCDatastore and NMEWriterFactory to save NMEAdapters.
l You can add a complete new set of collectors that use structured NMEs independent of your
existing collectors. The first-level collector uses a new encapsulator to read your input data,
generate NMEAdapters and save them in a FileJDBCDatastore. All higher level collectors would
The discussion assumes you have a basic understanding of structured NMEs and understand the
differences between traditional NMEs and structured NMEs. For an introduction to structured NMEs
see "Using Structured NMEs" (on page 118).
The following diagram shows five namespaces defined in the NME schema. The namespaces are
EricssonMessage, CreditControlApplication, EricssonGSMV10, TAP_0302 and EricssonGSMV9. These
namespaces are predefined by eIUM for specific data sources and are used by templates described
in the eIUM Template Reference.
Each namespace can define its own NME types. All the names within each namespace must be
unique. However, the same names can be used in different namespaces without ambiguity. When
you have the same names in two different namespaces, you may have to qualify the name with the
namespace.
The following diagram shows the NME schema editor with the EricssonMessage namespace opened
up and displaying the NME record definitions in the EricssonMessage namespace. Notice that it
defines an NME record type named ACAType. The right-hand pane shows the NME attributes and
sub-records defined in the ACAType NME type.
The EricssonMessage namespace defines several NME types including ACAType, ACRType and
AccountingMessage. The right-hand pane of the schema editor shows the ACAType NME type. It
defines the following five NME records within it: cost_Information, final_Unit_Indication, granted_
Service_Unit, subscription_Id and vendor_Specific_Application_Id. Notice that the optional column
is checked for these, indicating that they may or may not be present in any given input record.
It also defines the following NME attributes: accounting_Interim_Interval as a 64-bit integer (type
long), accounting_Multi_Session_Id as a string, accounting_RADIUS_Session_Id as a byte array,
accounting_Record_Number as a 64-bit integer (type long), accounting_Record_Type as a 32-bit
integer (type int) and check_Balance_Result as a 32-bit integer (type int).
Additional NME attributes are visible if you scroll down in the schema editor window.
NOTE: The NME schema editor displays entries in alphabetical order, not the order in which you
entered them. It displays all the sub-NME types first followed by all the NME attributes.
Namespaces define a unique naming context. Namespaces contain one or more type aliases and
one or more NME types. In the schema editor, namespaces are marked with the red triangle icon:
NME types define NME records. NME types consist of the NME attributes and the record structure
of your structured NME record definitions. NME types are marked with the blue triangle icon:
NMEs that are part of another NME type are shown with the blue diamond icon for required types
and a gray diamond for optional types:
NME attributes that are primitive types such as int, boolean, string and so forth are shown with a
blue ball for required attributes or gray ball for optional attributes:
This topic series assumes you understand the above terms. See "Using Structured NMEs" (on page
118) for more information on these terms.
The second step is to name each NME record or sub-NME record. This example will name the top-
level NME record MyNME and the second level NME MyDataRecord.
Once deciding on the NME record names, you can begin entering the NME record types. Since the
first-level NME contains the second-level NME, create the second-level NME first so the first-level
NME can refer to it. In general, create the lowest level NME types first.
In the schema editor, select the menu Schema -> New Data Type. The following dialog appears.
Enter the name of the record and the namespace you want to create as shown below.
Use the same menu item (Schema -> New Data Type) to create the MyDataRecord entry. The
following shows the schema editor with the new name space and empty records.
Continue adding the remaining NME attributes to the MyDataRecord NME. When you have finished,
the following shows this record in the schema editor. You will notice that the type alias Port is not
yet defined. Use the type int for now. The type alias Port will be defined manually as described
below.
The available predefined NME attribute types are listed in "Primitive NME Attribute Types" (on page
127). The available predefined type aliases are listed in "Predefined Type Aliases" (on page 127).
Now add attributes to MyNME by selecting MyNME in the left-hand pane and selecting the menu
item Schema -> New Attribute as before. Add the simple NME attributes CreateTime, NumRecord
and FileName as before. When you add the Data NME attribute, for the type, select the type
MySpace:MyDataRecord to make MyDataRecord a sub-NME record of MyNME. The resulting
MySpace name space and MyNME and MyDataRecord NME types are shown below in the schema
editor.
You can also use the File -> Save As menu item to save the entire structured NME schema to a file.
The following shows the output from using the saveconfig command or the Launchpad menu item
File -> Export Configuration and saving the node /SNMESchema/MySpace to a file. Note that some of
the types have been changed manually using the Launchpad Deployment Editor.
[/SNMESchema/MySpace]
[/SNMESchema/MySpace/MyDataRecord]
Attributes=DstIP,IPAddress
Attributes=DstPort,int
Attributes=EndTime,Time
Attributes=NumBytes,long
Attributes=NumPackets,long
Attributes=SrcIP,IPAddress
Attributes=SrcPort,int
Attributes=StartTime,Time
[/SNMESchema/MySpace/MyNME]
Attributes=CreateTime,Time
Attributes=Data,MySpace:MyDataRecord
Attributes=FileName,string
Attributes=NumRecord,int
[/SNMESchema/MySpace]
TypeAliases=Port,int
[/SNMESchema/MySpace/MyDataRecord]
Attributes=DstIP,IPAddress
Attributes=DstPort,Port
Attributes=EndTime,Time
Attributes=NumBytes,long
Attributes=NumPackets,long
Attributes=SrcIP,IPAddress
Attributes=SrcPort,Port
Attributes=StartTime,Time
[/SNMESchema/MySpace/MyNME]
Attributes=CreateTime,Time
Attributes=Data,MySpace:MyDataRecord
Attributes=FileName,string
Attributes=NumRecord,int
NOTE: The schema editor in IUM version 4.5 Feature Pack 4 and 5 does not support TypeAliases. If
you edit any NME schema that has TypeAliases and save the NME schema, the TypeAliases will be
removed. Add your type aliases manually to your configurations. The schema editor will support
TypeAliases in a future release.
[/SNMESchema/MySpace]
TypeAliases=Port,int
[/SNMESchema/MySpace/MyDataRecord]
Attributes=DstIP,IPAddress[]
Attributes=DstPort,Port,optional
Attributes=EndTime,Time
Attributes=NumBytes,long
Attributes=NumPackets,long
Attributes=SrcIP,IPAddress[]
Attributes=SrcPort,Port,optional
Attributes=StartTime,Time
[/SNMESchema/MySpace/MyNME]
Attributes=CreateTime,Time
Attributes=Data,MySpace:MyDataRecord
Attributes=FileName,string[],optional
Attributes=NumRecord,int
Overview 143
Overview
The Common Codec Framework is a system for structuring and transforming your data, and is
comprised of the following main aspects:
l The Codec Layer, which is responsible for encoding/decoding data. The data format is defined in
terms of a special Format Definition Language, or XFD, which is an XML-based language. Format
definitions are stored in *.xfd files. The Codec Layer can parse raw binary, text, or XMLinput data
streams for decoding, or format the same for encoding purposes. See "CCF:The Codec Layer" (on
page 146) for more information on the Codec Layer, and "XFD Syntax Reference" (on page 157)
for the Format Definition language.
l The Transformations Layer, which is responsible for mappings and transformation of input data,
using TX files (Transformation Definition files: *.tx, a custom eIUMXMLfile format that contains
the Transformations descriptors). The Transformations Layer can be thought of as the "glue"
that bridges the format definition (XFD), and the schema definition (XSD), in either direction (for
both decoding and encoding). See "CCF: The Transformations Layer" (on page 195) for more
information on the Transformations Layer, and "Language Overview" (on page 199) for the
Transformation Definition language.
l The Schema Layer, which is responsible for producing the NMEschema, using XSD files (XML
Schema Description: *.xsd). XSD is an XML format for describing the structure of XML documents.
For CCF,the XSDfiles describe the NMESchema used by eIUMand its components, in a similar
manner that other eIUMtools are used for (such as the SNMESchema Editor).
Files you work on in IUMStudio are organized into a perspective, which is a union of different views
and editors arranged in the main applications window (referred to as the Data Modeling
perspective; see the toolbar Window -> Open Perspective menu). This main perspective consists of
the following main sub-panels (or views, accessed via the Window -> Show View menu), and a central
editor and design area:
l Checked out projectsThis is a file explorer that lists files and directories checked out from the
eIUM repository. See "Repository Integration" (on page 144) for more information.
l Connections viewThis view allows creating/deleting/managing of connections to the eIUM
repository server, and check in/out/update files to/from the repository.
l Problems viewContains information about various validation errors and warnings.
l Outline viewA tree-based view of the active editor content (tags, nodes, and so on).
l The Source/Design editorThis is the main area for editing the XFD, TX, or XSD files in either XML
source code or visual design view. It is a multi-tabbed view where you can work with and have
multiple files open at once. XFD and TXfiles also possess a collapsible/expandable Palette menu
that allow you to perform specific actions related to creating or editing Format Definitions and
Codecs (XFD), or Transformations (TX).
IUM Studio also includes a wizard interface that supports automated Schema (XSD) and
Transformations (TX)generation based on a given XFD file. For more information on running the
wizard, see "Using the XFD-to-XSD Wizard" (on page 190).
Also see "Format Definitions in IUMStudio" (on page 166) for information on getting started with
IUMStudio and using the application for Codec Layer and Format Definition tasks. See
"Transformation Definitions in IUMStudio" (on page 225) regarding Transformations in IUM Studio.
Repository Integration
All the files you work with in IUMStudio can be saved and worked with individually or as part of a
project, and the application further integrates with the eIUMrepository server, where the Format
Definitions (XFD), Transformations Definitions (TX), and Schema Definitions (XSD) are uploaded and
referenced so other processes can share and use them. Files can be checked out from the
repository, worked with locally in the application, and then checked back in. See "Format Definitions
in IUMStudio" (on page 166) for information on the repository directory structure when getting
started with IUMStudio.
CCF Components
Once the IUMStudio has been used to process these files, the CCFfiles can be used for configuration
of eIUM components. For example, a collector can be created using the CCFFileEncapsulator, and its
configuration can be updated to point to the Format Definition (XFD) and Transformations (TX) files
in the repository (see the FormatDefinitionFile and MapDefinitionFile configuration attributes of this
component). The CCFFileWriterFactory can be used with the FileJDBCDatastore to store structured
NMEs into binary or text files (also see the FormatDefinitionFile and MapDefinitionFile configuration
attributes of this component).
For a description of these components and their configurable attributes and usage examples, see
the eIUMComponent Reference. Also see "CCF Components" (on page 272) for additional CCF
component information.
CCF Commands
eIUM also includes several command utilities that integrate with CCF (see the eIUM Command
Reference for complete details):
l The xfdtool command utility is a conversion tool that allows you to both create XFD files from
XSD files (xsd2xfd), and to create Transformations and NME descriptors from XFD files
(xfd2nme).
l The config2xsd command can read an SNME configuration file, and then generate XSD schemas
for a corresponding Structured NME schema.
l The repositorymanager command utility allows command-line based interaction for checking
files in/out of the eIUM repository server. It supports connect and disconnect functions,
validation, undo checkout operations, the ability to print change differences of local checkout
files versus those in the repository, and the ability to save frequently-used properties for
working with the repository. repositorymanager also integrates with CCF by being able to
validate all CCF descriptor files, namely: XFD, TX, and XSD with Java bindings.
l The ccftool utility and included docgen command allow you to produce CCF descriptors and
transformers documentation in HTMLformat. Beans XSD and NME XSD descriptors, as well as
built-in Transformers are supported.
Using the NME Type: {OneOfCIBERRecord} as an example, some sample output would be the
following:
During decoding, input data is interpreted according to the format definition. Each primitive type
field from the input data is read with respect to the given codec properties for the particular field
(encoding, size, big-/little-endian, signed/unsigned), and stored in a Java variable of the
corresponding type. Subsequently, the data is then passed to the Transformer. During the encoding,
value of each field is received from the Transformer, and encoded according to the format
definition and the particular field codec properties.
The next section describes the Format Definitions and corresponding (XFD) language that is used to
parse and determine the input data pattern.
Language Overview
Data formats are defined according to the XFD specification as a hierarchy of XFD types. One <type>
describes a piece of data for a particular format: text, raw binary, or XML. Each <type> definition
consists of a <codec> definition and <field> container. For example:
<type id="Foo" EOR="true">
<codec>
<raw/>
</codec>
<sequence>
<field id="f1" type="long" codec="UInt32"/>
<field id="f2" type "long" codec="UInt32"/>
</sequence>
</type>
In this example, the <codec> element defines the data format and different encoding/decoding
properties that are relevant to this format. It can contain one of the following nodes: text, raw, or
xml. <codec> can appear under the <type> element, which in this case describes <codec> on the
<type> level by specifying the data type (text, raw binary, xml). In case of text data, also one of the
processing modes must be specified (size, delimiter, pattern, format). For text processing modes,
see "Format Definitions for Different Data Types" (on page 149)). The EOR (End of Record) attribute
defines the record boundary. Each type with EOR="true" corresponds to one NME. In the case of
decoding, there can be several types with EOR="true", and for each one the separate NME will be
produced. In case of encoding, the EOR attribute must be one per format, at the root level.
On a <field> level, <codec> provides all the information needed to decode/encode a given field.
Accordingly, a field codec can be embedded into the <field> definition like the following:
<field id="value" type="string">
<codec>
<raw type="string" charset="ASCII" size="10" />
</codec>
</field>
This can also be separated, referenced from the field definition by "id" (this second form is
preferred when one codec definition is used for different fields):
<field id="value" type="string" codec="StringLen10" />
<codec id="StringLen10">
<raw charset="ASCII" size="10" />
</codec>
The <field> container can be one of the following: <sequence>, <set>, or <choice>. In <sequence>,
fields follow exactly in the order defined by the format. In <set>, fields can follow in any order. <set>
and <choice> are only supported for those formats that naturally support field discrimination, such
as XML.
The <field> container includes fields, and its definition defines field types (whether primitive or
constructed, that is, another XFD type), field id, and the field codec definition (optional). The field
<codec> describes the decoding/encoding method for the particular field. For constructed fields, the
field codec is not relevant because all information needed for the decoding/encoding of such a field
is contained in the corresponding <type> definition.
The following basic (or primitive) data types are supported in XFD:
l byte
l byte[]
l char
l int
l long
l short
l string
All types correspond to Java language types with the same name.
Meanwhile, the <switch> element allows choosing the field type dynamically depending on the value
of a specified field, and allows constructing tag-value formats. For example:
<type id="OneCIBERRecord">
<codec>
<raw/>
</codec>
<sequence>
<field id="recordType" type="int" codec="UInt2" />
<switch field="recordType">
<case value="12337">
<field id="recordType01" type="CIBERRecord01" />
</case>
<case value="12338">
<field id="recordType02" type="CIBERRecord02" />
</case>
<default>
<field id="custom" type="CustomRecord" />
</default>
</switch>
</sequence>
Conversely, instead of individual field definitions, an <array> of fields can be used to describe a
sequence of the same fields with a given length (the length attribute is optional). If the array length
is not specified, the decoder attempts to read elements till the next boundary specified by the
format, or till the end of input. If no length specified, the encoder just takes the actual length of the
array from the input record. For example:
<array id="records" length="5">
<field type="OneCIBERRecord " />
</array>
In the above example, length="5", means it consists of 5 elements of the OneCIBERRecord type.
Most format definitions are also reversible, that is, they contain enough information for the decoder
to recognize fields in the input stream, and for the encoder to produce output from given field
values. Some format types, however, are not reversible and can be used either for decoding or
encoding only. For example, the two different modes of text formats: (1) based on regular
expression patterns (decoding); and (2) that which is based on formatting patterns (see "Text Data"
(on page 149) for more information on regex- and formatting-based patterns).
See "XFD Syntax Reference" (on page 157) for a complete reference description of the syntax and
all Format Definition language elements.
</codec>
</field>
This example assumes that there is a transformer of type "BCDtoLong" that takes a BCD-encoded
byte array as input, and produces a long as output.
Text Data
Fixed-Length Fields
Each field has a fixed length that is specified in the format definition. Based on length values, the
decoder determines field boundaries. The encoder uses the length from XFD to ensure that values
coming from the Transformer conform to the format specification. If padding exists, then the
padding character can be specified by the "padding" attribute. The following is an example fixed-
length text format definition (notice mode="size" at the <type> level):
<type id="Timezone">
<codec>
<text mode=size/>
</codec>
<sequence>
<field id="TZName" type="string">
<codec>
<text size="3"/>
</codec>
</field>
<field id="offset" type="string">
<codec>
<text size="6" padding= />
</codec>
</field>
</sequence>
</type>
then "UTC" would be parsed from the input data due to the first <field> element ("TZName" field of
type "string", size=3 characters, no padding), and the second <field> element ("offset" field of type
"string", size=6 characters, padding - white space).
Delimiter-Separated Fields
Fields in a <type> element can be delimited by delimiter characters on a per-field basis. An empty
delimiter means that the decoder reads till the next boundary. An example format definition is the
following (notice mode="delimiter" at the <type> level):
<type id="PersonalData">
<codec>
<text mode=delimiter/>
</codec>
<sequence>
<field id=" FirstName" type="string">
<codec>
<text delimiter=;/>
</codec>
<field>
<field id=" LastName" type="string"/>
<codec>
<text delimiter=/>
</codec>
<field>
</sequence>
</type>
would be parsed according to this format definition (string fields "FirstName" and "LastName"
delimited by a semi-colon).
This text format is defined in terms of Regular Expression (regex) patterns. The regular expression
pattern must be specified for each field, with the <text> element using the corresponding "pattern"
attribute. The pattern is applied in multi-line mode, so ^ matches after any line terminator, and $ -
before any line terminator, not just at the beginning and the end of the input. Each pattern must
contain one matching group (in parentheses).
Field patterns are applied to the input sequence one-by-one. For each field, the sequence that
matches the field pattern is excluded from the input sequence. The sequence that matches the
group is extracted and passed further to the formatter as a value of the corresponding field.
NOTE: This type of format definition can be used only for decoding, not for encoding.
The following example shows regular expressions being used while decoding of an Apache web
server log:
<type id="ApacheWebLogRecord">
<codec>
<text mode=pattern/>
</codec>
<sequence>
<field id="clientIp" type="string"> <!-- {24.192.15.132 - } -->
<codec>
<text pattern="(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}) " />
</codec>
</field>
<field id="authUser" type="string"> <!-- {- } -->
<codec>
<text pattern="- (\\w*) " />
</codec>
</field>
<field id="sysDate" type="string">
<codec>
<text pattern="\\[(.*)\\] " />
</codec>
</field>
<field id="usageInfo" type="UsageInfo">
<codec>
<text pattern="\"(.*)\" " />
</codec>
</field>
<field id="requestStatus" type="int">
<codec>
<text pattern="(\\d*) " /> <!-- {200 } -->
</codec>
</field>
<field id="responseSize" type="int">
<codec>
<text pattern="(\\d*)" /> <!-- {1700} -->
</codec>
</field>
</sequence>
</type>
First, the sequence that matches the entire pattern is extracted from the input sequence
(highlighted yellow and red). Next, the sequence that matches the group is extracted and passed
subsequently to the formatter as a value of the clientIp field (highlighted in yellow). Only one
groupthat is, one pair of curly bracketscan be present in the pattern.
24.192.15.148 - kyle [14/Nov/1998:16:05:00 +0800] "GET
/gif/netsoft.gif HTTP/1.1" 304 100
The rest of the fields are processed in the same manner. The "authUser" field has the following
pattern: "- (\\w*) "
- kyle [14/Nov/1998:16:05:00 +0800] "GET /gif/netsoft.gif HTTP/1.1"
304 100
The text format is defined as a formatting pattern which contains placeholders for fields as field
names in curly brackets. The codec framework also supports all formatting options supported by
the java.util.Formatter class.
NOTE: This type of format definition can only be used for encoding.
For example:
<type id="DateAndTime">
<codec>
<text mode=format format="[{month}/{day}/{year}:{time}
{timeZone}]"/>
</codec>
<sequence>
<field id="month" type="int"/>
<field id="day" type="int"/>
<field id="year" type="int"/>
<field id="time" type="string"/>
<field id="timeZone" type="string"/>
</sequence>
</type>
Given this formatting type definition, the output would look like the following:
[14/Nov/1998:16:06:45 +0800]
The codec supports parsing of size-based binary formats, where fields can be extracted from the
input sequence based on size. The allowed size units are: Byte, Kilobyte, and Megabyte. For example:
<type id="FIELD">
<codec>
<raw/>
</codec>
<sequence>
<field id="version" type="int" codec="UInt1" />
<field id="id" type="int" codec="UInt1" />
<field id="value" type="string" codec="StringLen10" />
</sequence>
</type>
<codec id="UInt1">
<raw type="int" size="1" unit="Byte" order="big-endian"
unsigned="true" />
</codec>
<codec id="StringUTF8Len10">
<raw type="string" charset="UTF8" size="10" />
</codec>
E2 0A 01 02 03 04 05 06 07 08 09 00
Octets and corresponding field definitions are highlighted with the same color. Size can also be
defined as an arithmetical expression that contains values of other fields:
<sequence>
<field id="len" type="int" codec="UInt2" />
<field id="value" type="string">
<codec>
<raw charset=ASCII size=len - 2>
</codec>
</field>
</sequence>
Padding
If padding exists, the padding method can be specified using the "padding" attribute (the only
supported padding method is zero-fill):
<raw type="string" charset="ASCII" size="length - 2" padding=zero-
fill/>
XML Data
The <xml> sub-element of <codec> at the type level can be used to specify that the data is XML-
encoded. In the format definition, every non-leaf XML node is represented by a separate <type>.
Leaf nodes meanwhile are represented as primitive fields. The "path" attribute specifies either the
node name or node name and attribute name, separated by an @ character. The following element
types can be used to define the XML format:
<type id="Root">
<codec>
<xml />
</codec>
<sequence>
<field id="phoneBook" type="PhoneBook">
<codec>
<xml path="phonebook" />
</codec>
</field>
</sequence>
</type>
<codec>
<xml path="@version" />
</codec>
</field>
<field id="ownerType" type="string">
<codec>
<xml path="owner@type" />
</codec>
</field>
<field id="description" type="string">
<codec>
<xml path="@description" />
</codec>
</field>
<field id="owner" type="string">
<codec>
<xml path="owner" />
</codec>
</field>
<field id="contacts" type="Contacts">
<codec>
<xml path="contacts" />
</codec>
</field>
</sequence>
</type>
<type id="Contacts">
<codec>
<xml />
</codec>
<sequence>
<array id="persons">
<field type="PersonInfo">
<codec>
<xml path="personInfo" />
</codec>
</field>
</array>
</sequence>
</type>
<type id="PersonInfo">
<codec>
<xml />
</codec>
<sequence>
<field id="firstName" type="string">
<codec>
<xml path="firstName" />
</codec>
</field>
<field id="lastName" type="string">
<codec>
<xml path="lastName" />
</codec>
</field>
<field id="phoneNumber" type="long">
<codec>
<xml path="phoneNumber" />
</codec>
</field>
</sequence>
</type>
</root>
Mixed Data
<type id="Owner">
<codec>
<format>
The <format> element is the root of the Format Definition XML descriptor, and encloses elements
with decoding/encoding information. The structure of decoded/encoded data is specified by means
of <type> and <field> elements.
Syntax
<format xmlns="http://www.hp.com/usage/datastruct/xfd"
targetNamespace=xs:string >
(root, type*, codec*)
</format>
Attributes
targetNamespace Specifies the unique namespace of the defined format. Used to refer to type
structures from this format.
Elements
<root>
The <root> element specifies the root node of the format tree. All other types are the subtypes
(direct or indirect) of the root type. Decoding/encoding starts from this type.
Syntax
<root type= xs:string />
Attributes
<type>
The <type> elements are the main elements of a Format Definition descriptor. One <type> element
represents one data structure.
Syntax
<type type id=xs:string EOR?=true>
(codec, (sequence | choice | set))
</type>
Attributes
Attribute
Name Description
EOR End of Record marker. Optional, possible value: true. Indicates the NME boundary.
During decoding, for each type with EOR=true, the separate NME will be produced. At
least one type should have EOR=true, otherwise no NME will be produced. In case of
encoding, the NME always maps to the root type, so any EOR attributes in non-root
types are ignored.
Elements
<codec>
The <codec> element specifies decoding/encoding information for type and field elements which
enclose it.
Syntax
<codec id= xs:string>
(raw | text | xml)
</codec>
Attributes
Elements
<sequence>
Syntax
<sequence id= xs:string>
(field*, switch*, array*)
</sequence>
Elements
<choice>
The <choice> construct represents a choice between several fields. This can be used in formats
where fields are distinguished by special tags, like XML. <choice> has several fields inside, but only
one of them will actually be present in the input or output.
Syntax
<choice>
(field*)
</choice>
Elements
<set>
Represents a <set> of fields. In a set, unlike in <sequence>, elements can be in any order. Therefore
this construct makes sense only in formats where fields are distinguished by special tags, like XML.
Syntax
<set>
(field*, switch*, array*)
</set>
Elements
<array>
Syntax
<array if= xs:string
length= xs:string >
(field)
</array>
Attributes
Attribute
Name Description
id Id of the array.
length Specifies the length of array, but is optional. If not specified, the decoder attempts to
decode elements till the end of the input, and the encoder encodes all elements that
are present in the input record.
Elements
<field>
The <field> element represents a single value from structured data. The field can be of structured
and primitive type.
Syntax
<field id= xs:string
type= xs:string
codecId?= xs:string >
(codec?)
</field>
Attributes
Attribute
Name Description
codecId Specifies the codecId of the field. Codec can also be defined in-line, as a <codec>
element.
Elements
Element
Name Description
codec Field codec. Has the same function as codecId above, but here the codec is entirely
defined inside the <field> element.
<switch>
The switch element specifies the format when decoding/encoding depends on a certain value of
another field.
Syntax
< switch field= xs:string >
(case value= xs:string (field))*
</ switch >
Attributes
Attribute
Name Description
field Specifies the id of field that is used as a key field for the switch, that is, based on its
value, one or another field is decoded/encoded.
Elements
Element
Name Description
<raw>
The raw element specifies the properties of the raw binary codec.
Syntax
<raw type= xs:string
size= xs:int
unit= xs:string (byte | KByte | MByte)
order= xs:string (big-endian | little-endian)
unsigned= xs:Boolean (true | false)
charset= xs:string
padding= xs:string >
(use-transformer?)
</raw>
Attributes
Elements
<text>
The text element specifies properties of the text codec. At the type level, this element specifies a
decoding/encoding mode. At the field level, it specifies codec properties.
Syntax
On type level:
<text mode= xs:string (pattern | delimiter | size | format) />
On field level:
<text pattern= xs:string | delimiter=xs:string | size= xs:string |
format= xs:string />
Attribute
Name Description
l pattern Text format is defined based on regex patterns. Can be used for
decoding only.
l delimiter Format defined based on delimiters between fields.
Encoding/decoding.
l size Format defined based on fields size. Encoding/decoding.
l format Used only for encoding. Fields are encoded based on formatting
string.
Elements
Assuming input data with the following structure in some binary format:
[FixedLengthCDR] recordType=2
[DomesticCDR] recordType=3
<type id="CDRFile">
<codec> <raw /> </codec>
<sequence>
<field id="header" type="Header" />
<array id="cdrs">
<field type="CDR" />
</array>
</sequence>
</type>
<type id="Header">
<codec> <raw /> </codec>
<sequence>
<field id="fileType" type="int" codec="UInt2" />
<field id="dataFormatType" type="int" codec="UInt2" />
<field id="recordsSource" type="string" codec="StringUTF6Len" />
<type id="CDR">
<codec> <raw size="2048" unit="Byte" /> </codec>
<sequence>
<field id="recordType" type="int" codec="UInt2" />
<choice field="recordType">
<case value="2">
<field id="fixedLengthCDR" type="FixedLengthCDR" />
</case>
<case value="3">
<field id="domesticCDR" type="DomesticCDR" />
</case>
</choice>
</sequence>
</type>
<type id="FixedLengthCDR">
<codec> <raw /> </codec>
<sequence>
<field id="originalCallerId" type="string" codec="StringUTF8Len11"
/>
<field id="destinationCallerId" type="string"
codec="StringUTF8Len11" />
<field id="audioCodec" type="string" codec="StringUTF8Len6" />
<field id="terminationReason" type="string" codec="StringUTF8Len6"
/>
<field id="connectionTime" type="long" codec="ULong4" />
</sequence>
</type>
<type id="DomesticCDR">
<codec> <raw /> </codec>
<sequence>
<field id="originalCallerId" type="string" codec="StringUTF8Len6" />
<field id="connectionTime" type="long" codec="StringUTF8Len3" />
<field id="mobile" type="string" codec="UInt2" />
</sequence>
</type>
unsigned="true" />
</codec>
<codec id="StringUTF8Len3">
<raw type="string" charset="UTF8" size="3" />
</codec>
<codec id="StringUTF8Len6">
<raw type="string" charset="UTF8" size="6" />
</codec>
<codec id="StringUTF8Len11">
<raw type="string" charset="UTF8" size="11" />
</codec>
</format>
See "Transformations Syntax Reference (TX)" (on page 199) for the corresponding transformation
definition.
NOTE: If you need to convert an SNME configuration to an XSD schema, you can use the
config2xsd command. The command reads an SNME configuration file and generates XSD
schemas for a corresponding Structured NME schema. See the eIUMCommand Reference for
details.
l The xsd2xfd command, which allows you to generate XFD format files from schema definitions
inside of <type> elements enclosed by a given WSDL document. It can also generate XFD format
files from a given XML Schema definition (XSD) document.
l The xfd2nme command, which allows creating Transformations and NME descriptors from a
given XFD file.
For more information on xfdtool's options and examples, see the eIUMCommand Reference.
Starting IUMStudio
To start the IUM Studio, go to %BINROOT%/apps/IUMStudio to launch the IUMStudio executable
(IUMStudio.exe on Windows, or IUMStudio on UNIX). The application is displayed as below.
After launching the main interface, you can connect to the repository server by first left-clicking its
"RepositoryServer" label in the Connections pane.
This enables the connect button that you can click to connect to the repository server.
Click the connect button to establish the repository server connection (a progress indicator appears
to indicate this).
Once you are connected, you can then click the Checkout button in the Connections pane to begin
checking out files.
You are then prompted for the checkout destination directory. This is the local working directory on
your system where you will work with the XFD, TX, and XSD files in IUMStudio. By default this is
%VARROOT%/apps/IUMStudio/RepositoryServer.
After specifying the checkout directory, click Ok. The directory is then displayed in the Checked out
projects pane.
The eIUM deployment presumes and uses a certain directory structure under the root
/RepositoryServer directory for CCF. This is needed so you can set up your IUM Studio work
environment for the XFD, TX, and XSD files used by CCF. The directory structure is the following:
/datamodel
/beans
/format
/nme
/transform
The /beans and /nme directories are used by the Schema layer, namely for the XSD files. The
/format directory is used by the Codec and Format Definition layer (XFDand source data files),
while /transform is utilized by the Transformation layer (TX files). You can populate this directory
structure directly via the file system of the host running the IUMStudio (under
%VARROOT%/apps/IUMStudio/RepositoryServer), or you can use IUM Studio's built-in tools for
creating these directories. To do this, select the "datamodel" directory from the Checked out
projects pane, and either right-click and select New > Folder, or File > New > Folder. The New Folder
dialog is displayed, where you can create the necessary directory structure from within the
application.
NOTE: The directories under /datamodel are required and should be named accordingly.
Initially, as shown above, the repository is empty. If not named according to the required format,
files placed in a non-standard directory can fail validation and you will not be able to check in
modified files to the repository.
Now that all the required directories are populated, you can begin using the IUMStudio for your
CCFtasks. At this point you can check in your changes or begin working with your files and check in
your changes later. The following figure displays the starting view after all directories are created
(but no files are opened yet).
Source Tab
The Source tab allows you to edit the XFD file in text-only view where you can edit the XML source
directly.
When editing, you can also roll your mouse over an attribute for example to get a pop-up hint for
the attribute's possible values and its usage.
While typing to add new elements or attributes, the code assist will appear and prompt you with
available options, as shown in the following figure.
Notice that in the above figure, the source is validated as you type, with syntax errors indicated in
the vertical scroll area and warning indicators on the right. See the "XFD Syntax Reference" (on page
157) for more information on the format definition language and its configurable elements and
attributes that appear on the Source tab.
Types Tab
The Types tab consists of three parts: header, body, and Palette tool bar. The Palette contains the
following controls (which are context-sensitive based on the insertion point for adding, editing, or
deleting of elements):
l Collapse/expand allCollapse or expand all type boxes by clicking the -/+ button.
l Add importClick the Add import button to add a new <import> element.
l DeleteSelect an element in a <type> box or <type> box itself, or an <import>, and click the
delete button.
l New TypeCreate a new <type> box and generate a <type id="NewType" /> element in the
source.
l Add sequenceAdd a <sequence> element into the selected <type> and select a visual element
from the Palette representing the <sequence>. This Palette control is enabled only if an empty
type box is selected. In other words, the empty type box must be selected first, then, from the
Palette bar, select Add sequence.
l Add setAdd a <set> element into the selected <type> and select a visual element from the
Palette representing this <set>. This Palette control is enabled only if an empty <type> box is
selected and then clicking Add set, in the same manner that a <sequence> element is added
above.
l Add arrayAdd an <array> element into the selected <sequence> and select a visual element
representing this <array>, by clicking Add array.
l Add fieldAdd a <field> element into the selected <sequence> or <set>. This control is enabled
only if either a <sequence> or a <set> element is selected, and then clicking Add field. The
figures below show a <field> element being added into a <set>.
l Add choiceAdd a <choice> element into the selected <sequence> and select a visual element
representing this <choice>. This control is enabled when a <sequence> is selected, and then
clicking Add choice.
The following figures provide an orientation to the primary interface aspects and controls you can
work with on the Types tab.
The corresponding source view for this <type> element is the following:
<type id="CIBERRecord01">
<codec>
<raw size="198" unit="Byte" />
</codec>
<sequence>
<field id="BATCH_CREATION_DATE" type="string" codec="StringUTF8Len6"
/>
<field id="BATCH_SEQNO" type="string" codec="StringUTF8Len3" />
<field id="SENDING_SID" type="string" codec="StringUTF8Len5" />
<field id="RECEIVING_SID" type="string" codec="StringUTF8Len5" />
<field id="REC_REL_NO" type="string" codec="StringUTF8Len2" />
<field id="ORIG_RETURN_IND" type="string" codec="StringUTF8Len1" />
<field id="CURRENCY_TYPE" type="string" codec="StringUTF8Len2" />
<field id="SETTLEMENT_PERIOD" type="string" codec="StringUTF8Len6"
/>
<field id="CLEARINGHOUSE_ID" type="string" codec="StringUTF8Len1" />
<field id="BATCH_REJECT_REASON_CODE" type="string"
codec="StringUTF8Len2" />
<field id="BATCH_CONTENT" type="string" codec="StringUTF8Len1" />
<field id="LOCAL_CARRIER_RESERVED_FILLER" type="string"
codec="StringUTF8Len20" />
<field id="SYSTEM_RESERVED_FILLER" type="string"
codec="StringUTF8Len144" />
</sequence>
</type>
The corresponding source views for the first and last <type> elements from this figure are the
following:
<type id="CDRFile" EOR="true">
<codec> <raw /> </codec>
<sequence>
<field id="header" type="Header" codec="UInt1" />
<array id="cdrs" length="5">
<field type="CDR" />
</array>
</sequence>
</type>
...
<type id="CDR">
<codec> <raw/> </codec>
<sequence>
<field id="recordType" type="int" codec="UInt2" />
<switch field="recordType">
<case value="2">
<field id="fixedLengthCDR" type="FixedLengthCDR" />
</case>
<case value="3">
<field id="domesticCDR" type="DomesticCDR" />
</case>
</switch>
</sequence>
</type>
The header at the top of the file in Type view displays an editable text field with the format
identifier (namespace). You can click this field to change the value of the <format> element's
"targetNamespace" attribute.
The Types tab contents represents all the <type> elements in the XFDfile as a grid of collapsible and
expandable boxes (one box = one <type> element). From here you can click the box header, which
corresponds to the <type> "id" attribute that you can edit. Click to select the header (id), then click
again to make the text field available for editing.
The <type> box also contains each <type>s <field> elements, which you can edit in a similar manner,
as well as controls for editing inline codecs and marking the type as root. Certain fields have a drop-
down selection lists where you can choose different attribute values. To edit a field, first left-click it
to make it available for editing, as shown below.
For example, you can edit the <field> "id" attribute by entering it in the text box, select a new value
for the "type" or "codec" attributes (shown above), or add a "condition" attribute and value by
clicking the (?) icon. You can also click the gear icon to select the codec input data format by
selecting the corresponding "raw", "text", or "xml" options from the drop-down list. The following is
an example of the "type" attribute selections that can be chosen:
NOTE: You can also right-click any of the elements from the tree in the Outline pane to edit
elements and their attributes or values. As you work with a particular <type> element in the Type
tab, it will also be highlighted for you in the Source tab.
The <switch> element can also be collapsed and expanded in Type view. The following figure shows a
"CDR" <type> with the <switch> "recordType" currently collapsed.
Click the switch icon to expand the nested element view, as shown below.
See the "XFD Syntax Reference" (on page 157) for more information on the format definition
language and its configurable elements and attributes that appear on the Types tab.
Codecs Tab
The Codecs tab is very similar to the Types tab, with the main view consisting of a box grid that
represents the named codecs (the top-level <codec> elements with the "id" attribute). Much like the
Type tab for <type> elements, the box consists of an editable header (<format> element can be
edited just as in Types tab), with the codec ID and an editable list of the codecs properties. The
<codec>header contains a drop-down list of possible codec types (raw, text, XML). Changing the
value of the codec results in changing the list of codec properties and generation of corresponding
elements in the source (<raw>, <text>, <xml>). Furthermore, the Codecs tab contains a Palette bar
for context-specific actions, much like the Types tab.
On the Codecs tab you can perform the following functions with the corresponding Palette controls,
in much the same manner as that described for the Types tab:
l Collapse/expand allCollapse or expand all <codec> boxes by clicking the -/+ button.
l Add importClick the Add import button to add a new <import> element.
l DeleteSelect an element in a <codec> box or <codec> box itself, or an <import>, and click the
delete button.
l New codecCreate a new <codec> element and add a new codec box into the main Codec tab
body (by clicking the New codec button in the Palette bar).
The following figure summarizes these options and provides an orientation to the primary interface
controls you can work with on the Codecs tab.
NOTE: You can also modify the actual <codec> element from the Types tab by clicking the gear
icon in the upper left portion of the Type box.
See the "XFD Syntax Reference" (on page 157) for more information on the format definition
language and its configurable elements and attributes that appear on the Codecs tab.
l After running the wizard, it generates three files for each input XFD file: the XSD Schema, a
transformation (TX)file with automated mappings between existing XFD and XSD files (XFD ->
XSD), and a reverse transformation file (XSD -> XFD).
To launch this wizard, first right-click a given XFD file in the Checked out projects pane, and select
New -> Convert XFD to XSD.
Next, you can accept the file you originally selected or select additional files from the dialog.
After selecting files, you can specify the output directory for the generated XSD file (by default, the
assumed /nme directory is selected).
Lastly, specify the output directory for the generated transformation files (by default, the
/transform directory).
Click Finish to run the wizard. A confirmation dialog is displayed to indicate the number of files
created.
The Transformations Layer functionality allows transforming (or converting) simple or structural
data into different data types. Transformations are driven by the declarative transformation
directives expressed using the XML-based Transformations Definition language in IUM Studio's TX
files. The following types of transformations are supported by the Transformations Layer:
example, the CCF user can thus utilize a Simple Transformation, build a complex (Composite) one,
write Java code to build a simple Java transformation, or write a script to perform a transformation.
See "Simple Transformations" (on page 196) information on Simple Transformations, and
"Composite Transformations" (on page 240) for details on Composite Transformations.
Simple Transformations
To include a given Simple (Data) Transformer in another, more complex transformation, the <use-
transformer> element is used to specify mandatory attributes for the input type (from), for the
output type (to), and for the transformer local id, qualified name or class name ("class"). The
transformer qualified name is specified by "namespace prefix" : "transformer id". Below is an
example of a Simple Transformer used inside the transformation XML descriptor of a TXfile:
<import ns="http://www.hp.com/usage/datastruct/transform" prefix="tx"
/>
...
<use-transformer from="int" to="long" class="tx:IntToLongCopy" />
See "Language Overview" (on page 199) for more information on the Transformation Definition
language, and "<use-transformer> Class Attribute Values" (on page 207) for a listing of possible
"class" values that correspond to the transformers.
Transformation Parameters
Below is an example of a Simple parameterized transformer usage inside a corresponding
transformation descriptor in a TXfile, expressed in terms of the Transformation Definition
language's <use-transformer>, <params>, and <param> element definitions:
<import prefix="tx" ns="http://www.hp.com/usage/datastruct/transform"
/>
...
<use-transformer from="string" to="long" class="tx:DateStringToLong">
<params>
<param name="format" value="dd/mm/yyyy hh:mm:ss"/>
</params>
</use-transformer>
The main difference for Transformations used with the Codec Layer is that transformation
processes for decoding are driven by the Codec, not by the Transformations Layer. The Codec Layer
decides when to create output data structures and control the life cycle for them. Due to this
difference, not all of the Transformations features can be used along with the Codec Layer for
structural transformations:
l Script Transformations are not supported for transforming structural data, but it is still possible
to use Script Transformations for non-structural data. An example of non-structural script
transformation can be found above in the transformation "DateStringToLongScript" in
"Composite Transformations" (on page 240) (see Script Transformations).
l Nested paths for fields, like f1.f2.f3, are not supported in Bean (Structural) Transformation as
input or output fields for decoding or encoding correspondingly.
When generating codec and transformations code, the following scheme is applied:
The incoming NME to this rule must be an NMEAdapter or a standard NME. You can use this rule to
transform or just copy data values between structured and standard NME parts. The following types
of transformations are supported by the rule: NME -> NME, NME -> NormalizedMeteredEvent,
NormalizedMeteredEvent -> NME and NormalizedMeteredEvent -> NormalizedMeteredEvent.
The transformation can be mutual when the provided input NME or flat NME object is modified and
returned, or may require construction of a new output NME or Flat NME object. The
TransformationRule supports mutual transformation and construction of new output objects as
well. The TransformationRule can also construct new NME and Flat NME objects when needed.
Attribute Transformation
Transformations with NMEs and Flat NMEs are actually transformations of their attributes. NME and
Flat NME attributes are accessed by the CCF Transformations Layer with some key differences
however. NME attributes are accessed as bean attributes, which is supported when NMEs are used.
Attributes of Flat NMEs are accessed using dedicated transformers from the plug-in
com.hp.usage.datastruct.nme.transform.
This example demonstrates base features of the Transformations for NMEs and Flat NMEs.
Component Configuration
The TransformationRule requires the following information at runtime:
l The input and output object types, defined by the "InputType" and "OutputType" configuration
attributes. The NME object requires namespace and type information, whereas for Flat NMEs it is
sufficient just to mention the class name: NormalizedMeteredEvent.
l The path to the transformations XMLdescriptor, defined by the "TransformationPath"
configuration attribute. This can be a path to the repository server or URI in the file system. For
example, for the repository server, "datamodel/transform", or the file system path with the
prefix "file:///". The path can be provided to a directory as well as a file.
l The identifier of the transformer that will perform the transformation, defined by the
"Transformer" configuration attribute.
All this information is provided by means of the following configuration, for example:
[/deployment/host/server/RuleChains/transform
ClassName=com.hp.usage.datastruct.nme.rule.TransformationRule
InputType=CDRSample:CDRInfo
OutputType=NormalizedMeteredEvent
# transformations descriptor at RepositoryServer
Transformations=/datamodel/transform/NMETransformations.tx
# if transformations descriptor in file-system
# Transformations=file:///C:/IUM/desc/NMETransformations.tx
Transformer=CdrInfoToFlatNme
Language Overview
Much like the XFD Format Definition language, the XML-based Transformations Definition language
has a syntax that requires Transformations descriptors to be well-formed XML documents (TX files).
Besides the base XML rules the language conforms to, the Transformations Definition language has
its own syntax, which defines the possible XML elements and attributes, as well as their
combinations. The validation for such syntax is performed using the repositorymanager utility, as
well as IUMStudio.
In addition to these standard XML validations, the Transformations Definition language has its own
validator written in Java, which performs the following checks:
l Script validation. This is required when the script is written inside of a CDATA element, and should
be validated against the specified script language syntax.
l Data types consistency. The transformations XML descriptor refers to data structures, fields,
and transformers, and requires strong typing by design. Information about types consistency is
performed using types information from the XML descriptor and from Java annotations which
are required for the transformers.
For a description of the Transformation Definition language elements and syntax, see
"Transformations Syntax Reference (TX)" (on page 199).
<transformations>
The <transformations> element is the root of the Transformations XML descriptor, and encloses
elements with transformation information for structured and primitive data types.
Syntax
<transformations>
(format*,transformer*)
</transformations>
Elements
<format>
The <format> element specifies the namespace and format type of structured and primitive types
of data to be transformed.
Syntax
<format
type= xs:string
prefix= xs:string
ns= xs:string />
Elements
Element
Name Description
<type> Specifies the format type of data. The possible formats are: xsd, xfd, nme
and siu-nme.
<prefix> Specifies the prefix for the namespace to be used in the transformations.
<transformer>
The <transformer> elements are the main elements of Transformations descriptors, and define
transformations between structured or primitive types of the specified format.
Syntax
<transformer
id?= xs:string
from= xs:string to= xs:string >
(transform*?, script?, chain?, array?)
</transformer>
Attributes
Attribute
Name Description
id Specifies the name of the transformer and allows referencing this transformer
from other transformations.
Elements
Element
Name Description
<transform> Specifies the transformation for a pair of fields of structured data types. The
transformation is performed by a referenced or nested transformer.
<script> Specifies transformation between structured and primitive types using a script.
<transform>
The <transform> element specifies the transformation for a pair of fields from structured data
types. The transformation is performed by a referenced or nested transformer.
Syntax
<transform in= xs:string out= xs:string >
(use-transformer?, transformer?)
</transform>
Attributes
out Specifies the name of the data field to place the transformed value.
Elements
<script>
The <script> element specifies transformations between structured and primitive types using a
script. The script can be specified within a CDATA element or referenced from an external source.
Syntax
<script language= xs:string src?= xs:string >
(args(arg*)?, CDATA?)
</script>
Attributes
src Specifies external source for the transformation script to be taken from.
Elements
<chain>
Syntax
<chain>
(use-transformer*?, transformer*?)
</chain>
Elements
<array>
Syntax
<array>
(use-transformer)
</array>
Elements
<use- Specifies the transformer to be used for transforming the value of <array>
transformer> elements.
<use-transformer>
Syntax
<use-transformer
class= xs:string
from= xs:string to= xs:string >
(params(param*)?)
</use-transformer>
Attributes
Attribute
Name Description
class The qualified name of the transformer, that is, namespace_prefix : transformer_id,
transformer full class name, or local transformer id.
See "<use-transformer> Class Attribute Values" (on page 207) for a listing of possible
transformer classes.
Elements
<param>
Syntax
<param name= xs:string value= xs:string />
Attributes
<arg>
The <arg> element specifies information about the argument which transformations can accept.
Syntax
<arg name= xs:string value= xs:string />
Attributes
Transformation Example
[FixedLengthCDR] recordType=2
[DomesticCDR] recordType=3
See "XFD Syntax Reference" (on page 157) for an example of the corresponding XFD format
definition. The corresponding transformation could be the following:
<?xml version="1.0" encoding="utf-8"?>
<transformations xmlns=http://www.hp.com/usage/datastruct/transform
targetNamespace=http://www.hp.com/usage/datastruct/transform/cdrsample>
http://www.hp.com/usage/datastruct/transform
Input Output
Class Type Type Description
Base64String string byte[] Decode ASCII string with binary data in textual Base64
ToByteArray format into byte array.
BinaryString string byte Decode string with "0" and "1" characters as binary
ToByte data into byte value. For example, "0101" is decoded
into 5.
BinaryString string int Decode string with "0" and "1" characters as binary
ToInt data into int value.
BinaryString string long Decode string with "0" and "1" characters as binary
ToLong data into long value.
BinaryString string short Decode string with "0" and "1" characters as binary
ToShort data into short value.
BooleanArray boolean[] boolean Return one value, specified by the 'offset' parameter,
ToBoolean from array of boolean values.
Parameters:
BooleanObject java.lang boolean Convert Boolean Object into primitive boolean value.
ToBoolean .Boolean
BooleanTo boolean boolean[] Return one element sized boolean array which
BooleanArrayWrap contains only input value.
BooleanTo boolean boolean Return input boolean value. Can be used when value is
BooleanCopy just copied without changes.
BooleanTo boolean java.lang. Convert boolean primitive value into Boolean Object.
BooleanObject Boolean
BooleanTo boolean boolean Return boolean value as a negation operation, that is,
BooleanReverse logical 'NOT', under input boolean value.
Boolean boolean string Returns "false" of "true", when input value is false or
ToString true.
ByteArray byte[] string Encode byte array into ASCII string using Base64
ToBase64String encoding scheme.
ByteArray byte[] byte Return one value, specified by the 'offset' parameter,
ToByte from array of byte values.
Parameters:
ByteArrayTo byte[] byte[] Creates new output byte array and copies values from
ByteArrayCopy input array.
ByteArrayToByte byte[] byte[] Returns input byte array. Can be used when creation of
ArrayIdentity new array is not required.
ByteArrayTo byte[] string Encode the input data producing a Hex encoded String.
HexString
ByteArray byte[] int Read 4 bytes from the byte array and convert them to
ToInt int value.
Parameters:
ByteArray byte[] long Read 8 bytes from the byte array and convert them to
ToLong long value.
Parameters:
ByteArray byte[] short Read 2 bytes from the byte array and convert them to
ToShort short value.
Parameters:
Parameters:
ByteObject java.lang byte Convert Byte Object into primitive byte value.
ToByte .Byte
ByteTo byte string Encode byte value into binary format as a string with
BinaryString "0" and "1" characters.
ByteTo byte boolean Return boolean "true" or "false" for byte values "1" or
Boolean "0".
ByteTo byte byte[] Return one element sized byte array which contains
ByteArrayWrap only input value.
ByteTo byte byte Return input byte value. Can be used when value is just
ByteCopy copied without changes.
ByteTo byte java.lang Convert byte primitive value into Byte Object.
ByteObject .Byte
ByteTo byte char Return byte value as a char value using type casting.
CharCast
ByteTo byte string Return string with octal representation of byte value.
OctalString
ByteTo byte short Return input byte value casted to short type.
ShortCopy
CharArray char[] char Return one value, specified by the 'offset' parameter,
ToChar from array of char values.
Parameters:
CharArrayTo char[] char[] Create new output char array and copy values from
CharArrayCopy input array.
CharObject java.lang char Convert Char Object into primitive char value.
ToChar .Character
CharToChar char char[] Return one element sized char array which contains
ArrayWrap only input value.
CharTo char java.lang Convert primitive char value into Char Object.
CharObject .Character
CharTo char int Return char value as int value using type casting.
IntCast
CharTo char string Return new string which contains only one input char
StringWrap value.
Parameters:
DecimalString string byte Parse the input string as a signed decimal byte value
ToByte and return it.
DecimalString string int Parse the input string as a signed decimal int value and
ToInt return it.
DecimalString string long Parse the input string as a signed decimal long value
ToLong and return it.
DecimalString string short Parse the input string as a signed decimal short value
ToShort and return it.
DoubleArray double[] double Return one value, specified by the 'offset' parameter,
ToDouble from array of double values.
Parameters:
DoubleObject java.lang double Convert Double Object into primitive double value.
ToDouble .Double
DoubleTo double double[] Return one element sized double array which contains
DoubleArrayWrap only input value.
DoubleTo double java.lang Convert primitive double value into Double Object.
DoubleObject .Double
DoubleTo double float Return double value as a float value using type casting.
FloatTruncate
FloatArray float[] float Return one value, specified by the 'offset' parameter,
ToFloat from array of float values.
Parameters:
FloatObject java.lang float Convert Float Object into primitive float value.
ToFloat .Float
FloatToFloat float float[] Return one element sized float array which contains
ArrayWrap only input value.
FloatTo float java.lang Convert primitive float value into Float Object.
FloatObject .Float
HexString string byte Parses the string argument as a signed byte value in
ToByte hexadecimal format.
HexString string int Parses the string argument as a signed int value in
ToInt hexadecimal format.
HexString string long Parses the string argument as a signed long value in
ToLong hexadecimal format.
HexString string short Parses the string argument as a signed short value in
ToShort hexadecimal format.
IPv4String string byte[] Converts IPv4 address in its textual presentation form
ToByteArray into its numeric binary form.
IPv4String string int Converts IPv4 address in its textual presentation form
ToInt into its numeric binary form and return binary as int
value.
IntArray int[] int Return one value, specified by the 'offset' parameter,
ToInt from array of int values.
Parameters:
IntObject java.lang int Convert Integer Object into primitive int value.
ToInt .Integer
IntTo int byte[] Convert int value into byte array. Writes four bytes
ByteArray containing the given int value, in the current byte
order.
IntTo int char Return int value as a char value using type casting.
CharCast
IntTo int string Encode int value into string as a IPv4 address.
IPv4String
IntToInt int int[] Return one element sized int array which contains only
ArrayWrap input value.
IntToIntObject int java.lang Convert primitive int value into Integer Object.
.Integer
IntToShort int short Return int value as a short value using type casting.
Truncate
LongArray long[] long Return one value, specified by the 'offset' parameter,
ToLong from array of long values.
Parameters:
LongObject java.lang long Convert Long Object into primitive long value.
ToLong .Long
LongTo long byte[] Convert long value into byte array. Write eight bytes
ByteArray containing the given long value, in the current byte
order.
LongTo long string Convert long value with milliseconds since the January
DateString 1, 1970, 00:00:00 GMT into string in accordance with
specified format.
Parameters:
LongTo long int Return long value as int value using type casting.
IntTruncate
LongTo long long[] Return one element sized long array which contains
LongArrayWrap only input value.
LongTo long java.lang Convert primitive long value into Long Object.
LongObject .Long
ObjectArray java.lang java.lang Return one value, specified by the 'offset' parameter,
ToObject .Object .Object from array of Object values.
Parameters:
ObjectTo java.lang java.lang Return one element sized array of Objects which
ObjectArrayWrap .Object .Object contains only input value.
ObjectTo java.lang string Return string representation of the input Object using
String .Object toString() method.
OctalString string byte Parses the string argument as a signed byte value in
ToByte the octal format.
OctalString string int Parses the string argument as a signed int value in the
ToInt octal format.
OctalString string long Parses the string argument as a signed long value in
ToLong the octal format.
OctalString string short Parses the string argument as a signed short value in
ToShort the octal format.
ShortArray short[] short Return one value, specified by the 'offset' parameter,
ToShort from array of short values.
Parameters:
ShortObject java.lang short Convert Short Object into primitive short value.
ToShort .Short
ShortTo short byte[] Convert short value into byte array. Writes two bytes
ByteArray containing the given short value, in the current byte
order.
ShortTo short byte Convert short value into byte value by type casting.
ByteTruncate
ShortTo short string Returns the string representation of the short value.
DecimalString
ShortTo short string Returns the string representation of the short value in
HexString hexadecimal format.
ShortTo short int Return short value as int value using type casting.
IntCopy
ShortTo short string Returns the string representation of the short value in
OctalString octal format.
ShortToShort short short[] Return one element sized short array which contains
ArrayWrap only input value.
ShortTo short java.lang Convert primitive short value into Short Object.
ShortObject .Short
StringArray string[] string From array of boolean values to one boolean value.
ToString
Parameters:
StringTo string byte[] Encode input string into a sequence of bytes using the
ByteArray given charset, storing the result into a new byte array.
Parameters:
StringTo string char Return the first char value from the input string. If
CharTruncate string is null or empty then 'null' char with code
'\u0000' is returned.
StringTo string double Return a new double value initialized to the value
DoubleParse represented by the input string.
StringTo string float Return a new float value initialized to the value
FloatParse represented by the specified String.
StringToString string string[] Return one element sized array of strings which
ArrayWrap contains only input value.
StringTo string string Return new string with copied value of input string.
StringCopy
StringToString string string Return new string with copied value of input string with
LowerCase all characters converted to lower case using the rules
of the default locale.
StringTo string string Return new string with copied value of input string with
StringTrim leading and trailing whitespace omitted.
StringToString string string Return new string with copied value of input string with
UpperCase all characters converted to upper case using the rules
of the default locale.
http://www.hp.com/usage/datastruct/transform/attr
Input Output
Class Type Type Description
http://www.hp.com/usage/datastruct/transform/nme
Input Output
Class Type Type Description
See "Transformations Syntax Reference (TX)" (on page 199) for more information on the <format>
and <import> elements.
</transform>
...
</transformer>
See "Transformations Syntax Reference (TX)" (on page 199) for more information on the
<transformer> and <import> elements.
For more information about starting IUMStudio, see the section "Starting IUM Studio" in "Format
Definitions in IUMStudio" (on page 166).
Source Tab
The Source tab allows you to edit the TX file in text-only view where you can edit the XML source
directly.
Meanwhile, you can get code pop-up hints, code assist, and validation in the same manner described
for the Source tab in "Format Definitions in IUMStudio" (on page 166).
Design Tab
The Design tab consists of two views: the first main view when you open a Transformations
Definition file, and the Transformers view, which is accessed by clicking any of the graphical
transformer entries. First, the main view contains two tables: Imports and Transformers. The
following diagram provides an orientation to the Design tab main view interface aspects.
Main View
The Imports table contains all imports of types and transformers, declared in the <import>
elements. The table consists of two columns:
l PrefixThe <import> element's "prefix" attribute, which is a unique editable text field. To edit
the field, first left-click the field, then click again to edit the text box if you need to change the
value.
l NamespaceThe <import> element namespace identifier. This field is a drop-down list box
containing all known namespaces. To select a new entry, first left-click the field, and then click
again to make the drop-down list available for a selection change.
The Transformers table contains all named transformers, declared in the top-level <transformer>
and subsequent nested <transform> and <use-transformer> elements. This table contains only the
top-level, named transformers. All nested transformers are anonymous and do not have an
associated "id". The table consists of three columns:
l Transformer IDA unique editable text field that indicates the <transformer> element "id"
attribute. This can be edited by left-clicking, then clicking again to make the field available for
editing.
After populating the new transformer options and clicking Finish, the transformer appears as
another row in the Transformers table.
l Create Reverse TransformerLaunches the Create Reverse Transformer Wizard for the two
types declared in the selected transformer. When creating a Reverse Transformer, you only need
populate the Transformer id field. This control is only active when a transformer is selected and
no reverse transformers are found for the selected transformer.
l DeleteClick the Delete button to either remove an import row, or a transformer row if one is
selected.
Transformers View
Double-clicking on a transformer row switches the page from the main view to the Transformers
view.
The Transformers view consists of two trees representing the From type (left tree) and To (right
tree) type. The trees contain the type name and types attribute names and attribute types (if any).
The types and attributes are linked with arrows, representing the <script>, <chain>, <use-
transformer>, and <array> elements (as well as inline arrays and transformers). From this view the
Palette contains the following controls:
l ArrayAllows drawing an <array><use-transformer> arrow from either "From" type to "To" type,
or from "From" type attribute to "To" type attribute (double-clicking on the <array><use-
transformer> arrow switches the current view to the corresponding use-transformer view).
l Inline arrayAllows drawing a <transform><transformer><array> arrow from "From" type
attribute to "To" type attribute (double-clicking on the <transform><transformer><array> arrow
switches the current view to the corresponding transformer view).
To draw a transformer form the palette, first select one of the above chosen transformer actions
from the Palette (for example, the following figure shows a <use-transformer> element being
drawn):
Next, select the field from the left (From type) tree, and draw the line to the right (To type) tree.
As shown in the above figure, the mouse cursor will change to indicate that an insertion point is
available for you to start drawing a line from a field on the left tree to a node on the right tree.
After the line is draw, left-click to drop the line in place on the selected field. The line itself will then
indicate the transformer.
When you select and double-click any of the transformation arrows from the main view, you can go
to a successive page view for the selected transformer and change its properties, or you can change
transformers from the main view (via the arrow), as shown below.
The following figure shows a Use transformer-specific view (corresponding to the <use-
transformer> element) where a different transformation class can be selected, or the transformer
itself can be deleted via the Palette. To make the field available for editing, first select the field,
then left-click again to make the drop-down list appear as shown below.
When finished, click the Back arrow to return to the Transformers (the From-To tree) view.
Transformer views specific to the Array, Chain, and Script transformations are also accessible when
clicking the corresponding line. The Array-specific view (for the <array> element) is similar in
function to the <use-transformer>, allowing editing the text field to specify the array property.
Chain view represents the <chain> element and lists all declared <use-transformer> and
<transformer> elements. You can draw a <chain> element in the same manner as described above
for a <use-transformer>.
Double-clicking the Chain transformer then takes you to the Chain transformer-specific view.
l Transformer IDThis first column has a drop-down selection list containing all known
transformers. If this field is empty, the transformer is considered to be anonymous
(<transformer> element without id attribute). If this field is not empty, the transformer is
considered to be reference (<use-transformer>). Double-clicking on a transformer row switches
the current view to the selected transformer view, where you can further edit properties.
Double-clicking on this row switches the current view to the use-transformer view, which allows
you to add/edit the transformers arguments.
l From typeA text entry field representing the From type.
l To typeA drop-down selection list field representing the To type. First left-click, and then click
again to make the field available for editing.
The view contains a Back navigation button, which you can click to switch the current view back to
the Transformers (the From-To tree) view.
Script view represents the <script> element and contains a text editor for writing scripts, a drop-
down selection list for selecting the script language (MVEL or Groovy), text fields that can be edited
for specifying the script source URI, and Palette actions for defining script arguments. You can draw
a <script> element in the same manner as described above for a <use-transformer> or <chain>, as
shown below.
Double-clicking the Script transformer then takes you to the Script transformer-specific view.
Click Add argument to open a text-field entry box where you can specify arguments, or Add script,
which opens a script editor in the lower pane where you can enter your script code.
As with the other views, after done editing, click the Back navigation button to switch the current
view back to the Transformers (the From-To tree) view. For any of the Transformers view edits you
make, you can always check the Source tab view to see if the built-in Studio validation engine has
found any errors.
You can also check the Error Log for issues in the validation as well:
Composite Transformations
Composite Transformations are derivatives of the Simple or other Composite Transformations
producing a new transformation out of one or more existing transformations. The following types of
Composite Transformations are:
l Chain Transformations
l Array Transformations
l Structural Transformations
l Script Transformations
Chain Transformations
A Chain Transformation is the simplest Composite Transformation combining several (element)
transformations sequentially into a chain. For example, given three transformations such as: "A ->
B", "B -> C" and "C -> D", combining those into a chain will result in a new derived transformation,
namely: "A -> D". One restriction of the Chain Transformation is that each element transformation
output type has to match the next element transformation input type, except for the last element
of the chain.
<chain>
<use-transformer from="string" to="int"
class="tx:DecimalStringToInt"/>
<use-transformer from="int" to="long" class="tx:IntToLongCopy"/>
<use-transformer from="long" to="string"
class="tx:LongToHexString"/>
</chain>
</transformer >
Array Transformations
Array Transformations are repetitive transformations of array elements applying the same
transformation to each element. Assuming a given transformation of "X -> Y", it could be used to
transform an array of type "X" to an array of type "Y", namely: "X[] -> Y[]".
An Array Transformation instance can take parameters that specify the range of the elements to
apply the transformation to. These parameters are:
In the above example, the "IntArrayToLongArrayCopy" transformer class (defined earlier) is tasked
to transform 10 integers from the input array, starting from index 1 (the second <param> element),
into 10 longs, and then store those to the resulting arrays starting from index 2 (the third <param>
element). See "Transformations Syntax Reference (TX)" (on page 199) for more information on
Transformation Definition language syntax, and "<use-transformer> Class Attribute Values" (on
page 207) for the allowable <use-transformer> classes.
Structural Transformations
A Structural Transformation is a Composite Transformation combining multiple transformations of
the individual structural elements (attributes) together. For example, assuming that structure "X"
consists of attributes types "A", "B" and "C". Furthermore, assume another structure "Y" consists of
attributes of types "D", "E", and "F" accordingly. In order to transform structure "X" into "Y", the
following attribute transformations would be required: "A -> D", "B -> E", and "C -> F". Attribute
transformations are also applied exactly in the same order as those configured.
A similar (but a bit more complex) structural transformation could be described in the following way,
in terms of the Transformation Definition Language:
<import prefix="beans"
ns="http://www.hp.com/usage/datastruct/beans/examplebeans" />
<import prefix="tx" ns="http://www.hp.com/usage/datastruct/transform"
/>
...
<transformer id="BeanXToBeanY" from="beans:BeanX" to="beans:BeanY">
<!-- BeanX has a substructure "name", which has "fullName"
string attribute among the others -->
<transform input="name.fullName" output="name">
<use-transformer from="string" to="string"
class="tx:StringToStringIdentity" />
</transform>
<!-- BeanY has a substructure "id", which has "key" integer
attribute among the others -->
<transform input="id" output="id.key">
<use-transformer from="int" to="int" class="tx:IntToIntCopy" />
</transform>
<!-- BeanY has a substructure "id", which has "timestamp"
string attribute among the others -->
<transform input="timestamp" output="id.timestamp">
<use-transformer from="long" to="string"
class="tx:LongToDecimalString" />
</transform>
</transformer>
Array Attributes
If any of these attributes "a", "b", "c", "d", "e" or "f" was an array, it would be desired to refer to an
individual element of such array as part of the Structural Transformation. For instance, if attribute
"b" had array type B[], and attribute "e" had regular type E, it would be possible to perform the
following the transformation: {"b[1]" -> "e"}, where "b[1]" is the second element of the attribute "b"
and it has type B. For this, transformation B -> E could be applied. The CCF Transformations Layer
supports such array references for Structural Transformations.
NOTE: Leaf attribute references are supported, as well as more advanced support including
attributes representing arrays of structures and references to the nested structures elements
through a concrete array element. For example: {"b[1].k" -> "e"}. However, the opposite is not
supported.
The following Transformations Definition language descriptor fragment demonstrates how data
from NME of "CDR" type is transformed into data in NME of "CallInfo" type, converting three
elements of an array represented by the "data" attribute into a call info structure (attribute
"original", "destination", and "duration"):
<!-- transformers import -->
<import prefix="tx" ns="http://www.hp.com/usage/datastruct/transform"
/>
<!-- NME types import -->
<import prefix="nmes"
ns="http://www.hp.com/usage/nme/nmeschema/ExampleNamespace" />
<transformer id="CDR2UserData" from="nmes:CDR" to="nmes:CallInfo">
<transform input="data[0]" output="original">
<use-transformer from="string" to="string"
class="tx:StringToStringCopy" />
</transform>
<transform input="data[1]" output="destination">
<use-transformer from="string" to="string"
class="tx:StringToStringCopy" />
</transform>
<transform input="data[2]" output="duration">
<use-transformer from="string" to="int"
class="tx:DecimalStringToInt" />
</transform>
</transformer>
Structures that implement the com.hp.usage.nme.NME interface use specialized array wrapper
objects that can be used by SNME arrays (defined in the com.hp.usage.array package) to handle
the array types. The following transformations exist for each array type, where the following are
read in terms of the input type -> output type, and the <use-transformer> "class" attribute, that is,
the transformer after the colon (also see "<use-transformer> Class Attribute Values" (on page 207)
for a list of the transformer values taken by the "class" attribute):
ns="http://www.hp.com/usage/datastruct/transform/nme" />
<!-- nme types import -->
<import prefix="nme" ns="http://www.hp.com/usage/nme/nmeschema" />
<transformer id="IntArrayToHexStringArrayWrapper" from="int[]"
to="nme:string-array">
<chain>
<transformer from="int[]" to="string[]">
<array>
<use-transformer from="int" to="string"
class="tx:IntToHexStringCopy"/>
</array>
</transformer>
<use-transformer from="string[]" to="nme:string-array"
class="nmetx:StringArrayToStringArrayWrapper"/>
</chain>
</transformer>
attribute class (named accordingly following the naming scheme of N Attribute for N data type). The
following list of attributes is currently used in eIUM:
l IntegerAttribute
l LongAttribute
l FloatAttribute
l DoubleAttribute
l BinaryAttribute
l TimeAttribute
l StringAttribute
l UnicodeStringAttribute
l MutableStringAttribute
l UUIDAttribute
l IPAddrAttribute
l IPv6AddrAttribute
l ListAttribute
l RangeAttribute
For each of these attributes, the corresponding Simple Transformations are provided. For example,
BinaryAttribute would have the following four standard Simple Transformations defined:
Script Transformations
Simple and Composite transformations provide comprehensive transformation capabilities to a
wide variety of use cases, and in most cases is sufficient for implementing all required
transformation scenarios. However, when more flexibility is required, using Script Transformations
could be an option. A Script Transformation is a transformation adapter that allows integrating a
general scripting runtime into the CCF Transformation Layer, and executing external scripts in the
context of complex transformation trees. Such a transformation is similar to any regular simple
transformation, except it would run a script inside for its transformation logic.
Script Transformations utilize an external scripting engine to compile and run transformation
scripts, while providing necessary context for the script. As part of such a context, the following
artifacts are injected into the script:
The below is an example of how a Simple Script transformer can be defined to convert a date-
formatted string into milliseconds:
<transformer id="DateStringToLongScript"
from="string" to="long">
<script language="MVEL">
<args>
<arg name="format" type="string"
default="..."
description="..." />
</args>
<![CDATA[ //MVEL script
java.text.SimpleDateFormat inputFormat =
new java.text.SimpleDateFormat(format);
java.util.Date date = inputFormat.parse(input);
return date.getTime();
]] //CDATA end tag removed here for format reasons
</script>
</transformer>
Moreover, the IUMStudio can also compile and validate such Script Transformations written in
Groovy or MVEL. Scripts can also be combined with other Simple or Composite Transformations as
shown in the following example:
<import prefix="tx" ns="http://www.hp.com/usage/datastruct/transform"
/>
...
<transformer id="DecimalStringToHexStringScript"
from="string" to="string">
<chain>
<use-transformer from="string" to="long"
class="tx:DecimalStringToLong"/>
<transformer from="long" to="string">
<script language="MVEL">
<![CDATA[ //MVEL script
return Long.toHexString(input);
]] //CDATA end tag removed here for format reasons
</script>
</transformer>
</chain>
</transformer>
Scripts provide a powerful extension mechanism to Structural Transformations, which can be used
for implementing a partial or full Structural Transformation as demonstrated below:
<import prefix="nmes"
ns="http://www.hp.com/usage/nme/nmeschema/ExampleNmes" />
<transformer id="MyNmeAToNmeB" from="nmes:NmeA" to="nmes:NmeB">
<script language="MVEL">
<![CDATA[ //MVEL script
// "input" has type NmeA and "output" is pre-created and has type
NmeB
if(input.attrA1Flag) {
output.attrB1 = input.attrA1;
}
Language Overview
Schema layer definitions are defined using two language formats:
For a description of the Beans and SNME Schema language elements and syntax, see "Beans
Schema Syntax Reference (XSD)" (on page 249) and "SNMESchema Syntax Reference (XSD)" (on
page 256).
<schema>
At the top of each types definition there is a schema XML element which encloses all other possible
elements. At the schema element, the target namespace for types in that definition and the alias
Syntax
<schema
Xmlns=xs:string
targetNamespace=xs:string
xmlns:namespace-alias*=xs:string>
(annotation?,
import*,
complexType*,
simpleType*)
</schema>
Attributes
xmlns Specifies the namespace for all XML elements the schema contains. Usually
"http://www.w3.org/2001/XMLSchema".
targetNamespace Specifies the namespace which all types defined in this schema belong to.
xmlns:namespace- Declares the imported namespace so it can refer types from that namespace
alias in the local schema.
Elements
Element
Name Description
This element has only one attribute namespace to specify the imported
namespace by name.
simpleType Can be used as an alias for already-existing primitive types, or to specify special
constraints on values of those types.
<complexType>
The primary concept in the Beans Schema language is a data structure or data type represented by
XSD <complexType>. Such data structures can define their own set of data fields using an XSD
Syntax
<complexType name=xs:string>
(annotation?,
sequence(element*)|
complexContent(extension(sequence(element*)))
</complexType>
Attributes
Attribute
Name Description
Name Name of the type defined by this complexType. The qualified type name will consist of
this name and targetNamespace defined in the enclosing schema element.
Elements
complexContent Together with the extension element, used to specify a data type to extend.
extension Enclosed within the complexContent element and used to specify a data type to
extend. Has a name attribute to specify the name of the data type to extend.
<element>
Syntax
<element
name=xs:string
type?=xs:string
minOccurs?=xs:int
maxOccurs?=xs:int>
(annotation?,
(complexType|simpleType)?)
</element>
Attributes
Attribute
Name Description
type The type of the field. Can be qualified and represented by the namespace and type
name from that namespace, or can be a simple type name if the type is from a local
namespace.
minOccurs Specifies whether this field is required or not. The default value is the same as in the
XSD specification and minOccurs=1 (required). Cannot be used when the value
element of an array is defined.
maxOccurs Specifies the maximum number of times an element can occur. The default value is
the same as in the XSD specification and maxOccurs=1.
For cases when the value element of an array is defined, the value of maxOccurs
should be >=1, or unbounded. In other cases, maxOccurs of another value other
than the default will be ignored.
Elements
Element
Name Description
<simpleType>
Another important concept is a primitive type definition. It is possible to define your own set of
primitive types which correlate with the application domain model, and use those types for data
modeling in that domain. The primitive type is defined by the XSD simpleType.
Syntax
<simpleType name=xs:string>
(annotation?,
restriction,
(enumeration,
fractionDigits,
length,
maxExclusive,
maxInclusive,
maxLength,
minExclusive,
minInclusive,
minLength,
pattern,
totalDigits,
whitespace)?)
</simpleType>
Attributes
Attribute
Name Description
name Name of the type defined by this simpleType. The qualified type name consists of this
name, and targetNamespace defined in the enclosing schema element.
Elements
enumeration, fractionDigits, Standard XSD facets enclosed within the restriction element
length, maxExclusive, and used to define restrictions on XML elements. Refer to
maxInclusive, maxLength, the standard XSD documentation for details
minExclusive, minInclusive, (http://www.w3.org/TR/2004/REC-xmlschema-2-
minLength, pattern, totalDigits, 20041028/datatypes.html#rf-facets).
whiteSpace
<annotation>
The annotation element represents information similar to Java annotations, and can be used for
documentation purposes as well.
Syntax
<annotation>
(documentation?, appInfo*)
</element>
Elements
<appInfo>
The appInfo element represents information relevant to the certain application area which is
specified by the "name" attribute. The format of enclosed data depends on the application area and
can vary.
Syntax
Attributes
Elements
Arrays Definition
There are two ways in the Beans Schema Language that array types can be defined. These
approaches use similar but somewhat different notation from the XSD language perspective.
<complexType name="PersonInfoArray">
<sequence>
<element name="value" type="tns:PersonInfo" maxOccurs="unbounded"/>
</sequence>
</complexType>
In this approach, the dedicated data type is defined as a named <complexType>, which can be
referenced from other places. The defined data type must enclose only one element representing a
data field. The elements name should be value, and the elements type should correspond to the
type of array elements. This element is only allowed to have the maxOccurs attribute to specify the
array size.
<element name="phoneNumbers">
<complexType>
<sequence>
<element name="value" type="xs:string" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
The anonymous type is the type that is defined inline, and which has no name and thus cannot be
referenced from other places (rather than from where it is defined). This is the only difference
compared to the dedicated named array type approach.
The following is an example of Beans Schema Language usage, where a simple phonebook
containing different persons' information is modeled. In the sample below, PhoneBook.xsd defines
the PhoneBook data structure, which has owner, description, and contacts fields. The contacts field
points to an array of PersonInfo structures, defined in the same namespace but in another
PersonInfo.xsd file.
<?xml version="1.0" encoding="UTF-8"?>
<schema
targetNamespace="http://www.hp.com/usage/datastruct/beans/contacts"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.hp.com/usage/datastruct/beans/contacts">
<complexType name="PhoneBook">
<sequence>
<element name="owner" type="xs:string"/>
<element name="description" type="xs:string/>
<element name="contacts" type="tns:PersonInfoArray"/>
</sequence>
</complexType>
<complexType name="PersonInfoArray">
<sequence>
<element name="value" type="tns:PersonInfo" maxOccurs="unbounded"/>
</sequence>
</complexType>
</schema>
The PersonInfo.xsd sample below defines the PersonInfo data structure, which contains such
information as first name, last name, and phone numbers. FullPersonInfo extends PersonInfo and
adds optional information about the persons address and date of birth. The Address data structure
describing address information is defined in a different namespace, which is imported by means of
the xmlns:loc namespace-alias declaration and import element.
<?xml version="1.0" encoding="UTF-8"?>
<schema
targetNamespace="http://www.hp.com/usage/datastruct/beans/contacts"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:loc=" http://www.hp.com/usage/datastruct/beans/location""
xmlns:tns="http://www.hp.com/usage/datastruct/beans/contacts">
<import
namespace="http://www.hp.com/usage/datastruct/beans/location"/>
<complexType name="PersonInfo">
<sequence>
<element name="firstName" type="xs:string" />
<element name="lastName" type="xs:string" />
<element name="phoneNumbers">
<complexType>
<sequence>
<element name="value" type="xs:string" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
<complexType name="FullPersonInfo">
<complexContent>
<extension base="tns:PersonInfo">
<sequence>
<element name="address" type="loc:Address" minOccurs="0"/>
<element name="dateOfBirth" type="xs:string" minOccurs="0"/>
</sequence>
</extension>
</complexContent>
</complexType>
</schema>
In the Address.xsd sample below, the Address data structure is defined. In addition to the Address
structure, the simple type ZipCode is defined, which is used as an alias for the xs:string type.
<?xml version="1.0" encoding="UTF-8"?>
<schema
targetNamespace="http://www.hp.com/usage/datastruct/beans/location"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.hp.com/usage/datastruct/beans/location"
xmlns:tags="http://www.hp.com/usage/datastruct/ext/annotation/persistence">
<complexType name="Address">
<sequence>
<element name="address" type="xs:string" />
</element>
<element name="country" type="xs:string">
</element>
<element name="zipCode" type="tns:ZipCode" minOccurs="0" />
</sequence>
</complexType>
<simpleType name="ZipCode">
<restriction base="xs:string" />
</simpleType>
</schema>
l Native support to represent structured data and optional attributes. Structured data is
referenced as NME type.
l One-dimensional array support for primitive types, string type, and NME types.
l Namespace-aware schema to define the fields of data records.
l Finite set of primitive data types that can be used to define the fields in a data record:
Primitive Data Types
Primitive Data Type Description
<schema>
At the top of each SNME Schema XSD definition, there is a <schema> XML element which encloses all
other possible elements corresponding to modeled NME types, or which assist the modeling. At the
<schema> target, the namespace for NME types in that definition and the alias for other
namespaces are specified as attributes.
Syntax
<schema
xmlns = xs:string
targetNamespace = xs:string
xmlns:namespace-alias* = xs:string>
(annotation?,
import*,
complexType*,
simpleType*)
</schema>
Attributes
xmlns Specifies the namespace for all XML elements the schema contains. Usually
"http://www.w3.org/2001/XMLSchema".
targetNamespace Specifies the namespace which all NME types defined in this schema belong
to.
xmlns:namespace- Declares the imported namespace so it can refer to types from that
alias namespace in the local schema. The most essential namespace is
"http://www.hp.com/usage/nme/nmeschema", since it contains the definition
for the SNME built-in primitive types and aliases, which are to be used in
SNME Schema XSD definitions instead of XSD built-in types from
"http://www.w3.org/2001/XMLSchema".
Elements
Element
Name Description
complexType Represents the NME type definition. Can be used also to define an alias for an
existing NME type, as well as for another NME type alias.
simpleType Represents an alias for one of the SNME primitive built-in types. Can be used to
define an alias for existing primitive type aliases as well.
annotation Used to provide documentation about the defined SNME namespace and enclosed
NME types in general.
<complexType>
This <complexType> element is used to define the NME type and its attributes. It can be used to also
define an alias for another NME type.
Syntax
<complexType name = xs:string>
(annotation?,
sequence(element*)|
complexContent(extension))
</complexType>
Attributes
Attribute
Name Description
name Name of the NME type defined by this complexType element. The qualified NME type
name will consist of this name and the targetNamespace defined in the enclosing
schema element.
Elements
complexContent Together with the extension element, used to specify the NME type when the
alias for another NME type is defined.
extension Enclosed within the complexContent element and used to specify the NME type
when the alias for that type is defined. Has the name attribute to specify the
name of the target NME type.
annotation Used to provide information about the NME type represented by this
complexType element.
<element>
The element represents an attribute which belongs to the enclosing NME type.
Syntax
<element
name = xs:string
type? = xs:string
minOccurs? = xs:int
maxOccurs? = xs:int>
(annotation?,
complexType?)
</element>
Attributes
Attribute
Name Description
type The type of the attribute. Can be qualified and represented by the namespace and
name of the NME type from that namespace, or it can be the simple type name if the
type comes from the local namespace.
This attribute can be absent if the NME type is defined as an enclosed anonymous
type. This is the case when it is an attribute of the NME array type.
minOccurs Specifies whether this attribute is required or optional. Default value is minOccurs=1
(required). Cannot be used when the value element of the NME array is defined.
maxOccurs Specifies the maximum number of times an attribute can occur. Default value is
maxOccurs=1. For cases when the value attribute of the NME array is defined, the
value of maxOccurs must be unbounded. Values other than 1 (the default) and
unbounded (for array) are not supported.
Elements
Element
Name Description
annotation Used to provide documentation about the attribute represented by the enclosing
<element>.
complexType Anonymous complexType definition. Can be used for defining the attributes type
if the type is an NME array.
<simpleType>
This element is used for the SNMEs alias feature. Since an SNME has a fixed number of primitive
types, it is possible only to assign an alias for them, which can be accomplished using the
<simpleType> element.
Syntax
<simpleType name=xs:string>
(annotation?,
restriction)
</simpleType>
Attributes
Attribute
Name Description
name Name of the alias defined by this simpleType. The qualified alias name will consist of
this name and the targetNamespace defined in the enclosing schema element.
Elements
Element
Name Description
restriction Specifies a target SNME built-in primitive type for this alias, or another existing
alias of the same kind.
Annotation Used to provide documentation about the alias represented by the enclosing
<simpleType>.
The built-in primitive types and predefined aliases of SNMEs are supported in the form of a
separate BuiltinTypes.xsd definition, with the targetNamespace as
"http://www.hp.com/usage/nme/nmeschema".
boolean nme:boolean
boolean[] nme:boolean-array
byte nme:byte
byte[] nme:byte-array
short nme:short
short[] nme:short-array
int nme:int
int[] nme:int-array
char nme:char
char[] nme:char-array
Long nme:long
long[] nme:long-array
float nme:float
float[] nme:float-array
Double nme:double
double[] nme:double-array
String nme:string
string[] nme:string-array
Arrays Support
According to SNME requirements, the SNME Schema XSD language should support one-dimensional
array definitions for primitive and NME types, as well as aliases for them.
See the primitive types arrays discussed in "SNME Primitive Types Support" (on page 260), together
with primitive types.
In this approach, the dedicated NME type is defined as a named complexType, which can be
referenced from other places. The defined NME type must contain one value attribute. The type of
the value should correspond to the NME type of the array elements. The maxOccurs attribute of
the unbounded value must be present as well to specify array size.
The anonymous NME array type is the type that is defined inline, and which has no name and thus
cannot be referenced from other places versus from where it is defined. This is the only difference
as compared with the dedicated named NME array type approach.
The following are language examples defined using the eIUMconfiguration language, and the SNME
Schema XSD declaration language.
eIUM Configuration
This approach assumes that the schema is defined via eIUM configuration, similar to the properties
format.
Sample 1: SNMESchema_Diameter_CCA.config
[/SNMESchema]
[/SNMESchema/CreditControlApplication]
[/SNMESchema/CreditControlApplication/CreditControlMessage]
Attributes=request,CreditControlApplication:CCRType,optional
Attributes=answer,CreditControlApplication:CCAType,optional
[/SNMESchema/CreditControlApplication/CCAType]
Attributes=session_Id,string
Attributes=result_Code,long
Attributes=origin_Host,string
Attributes=origin_Realm,string
Attributes=auth_Application_Id,long
Attributes=proxy_Info,CreditControlApplication:Proxy_Info[],optional
Attributes=route_Record,string[],optional
[/SNMESchema/CreditControlApplication/CCRType]
Attributes=session_Id,string
Attributes=origin_Host,string
Attributes=origin_Realm,string
Attributes=dest_Realm,string
Attributes=auth_Application_Id,long
Attributes=subscription_Id,CreditControlApplication:Subscription_
Id[],optional
For CreditControlMessage.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="../usage/nme/nmeschema/CreditControlApplication"
xmlns:tns="../usage/nme/nmeschema/CreditControlApplication">
<complexType name="CreditControlMessage">
<sequence>
<element name="request" type="tns:CCRType" />
<element name="answer" type="tns:CCAType" />
</sequence>
</complexType>
</schema>
For CCAType.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="../usage/nme/nmeschema/CreditControlApplication"
xmlns:tns="../usage/nme/nmeschema/CreditControlApplication"
xmlns:nme="../usage/nme/nmeschema">
<import namespace="http://www.hp.com/usage/nme/nmeschema"/>
<complexType name="CCAType">
<sequence>
<element name="sessionId" type="nme:string" />
<element name="resultCode" type="nme:long" />
<element name="originHost" type="nme:string" />
<element name="originRealm" type="nme:string" />
<element name="authApplication_Id" type="nme:long" />
<element name="routeRecord" type="nme:string-array"
minOccurs="0" />
<element name="proxyInfo" minOccurs="0">
<complexType>
<sequence>
<element type="CreditControlApplication:ProxyInfo"
name="value" maxOccurs="unbounded" />
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</schema>
For CCRType.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="../usage/nme/nmeschema/CreditControlApplication"
xmlns:tns="../usage/nme/nmeschema/CreditControlApplication"
xmlns:nme="../usage/nme/nmeschema">
<import namespace="http://www.hp.com/usage/nme/nmeschema"/>
<complexType name="CCRType">
<sequence>
<element name="session_Id" type="nme:string" />
<element name="origin_Host" type="nme:string" />
<element name="origin_Realm" type="nme:string" />
<element name="dest_Realm" type="nme:string" />
<element name="auth_Application_Id" type="nme:long" />
<element name="service_Context_Id" type="nme:string" />
<element name="subscription_Id" minOccurs="0">
<complexType>
<sequence>
<element name="value" type="tns:Subsription_Id"
maxOccurs="unbounded" />
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</schema>
The Beans and NME XSD language allows extending structural data types using the <extension>
element. For example:
<complexType name=AddressBase>
<sequence>
<element name=state type=xs:string />
<element name=city type=xs:string />
</sequence>
</complexType>
<complexType name=AddressExt>
<complexContent>
<extension base=this:AddressBase>
<sequence>
<element name=street type=xs:string />
<element name=building type=xs:string />
</sequence>
</extension>
</complexContent>
</complexType>
The resulting AddressExt Bean type has 4 fields: state, city, street, and building. The NME XSD
language also allows extending NME types using the <extension> element. Yet unlike Beans types,
the NME types are not polymorphous and not compatible, that is, base type attribute cannot be
assigned with the value of the child type. For example:
<complexType name=BaseCDR>
<sequence>
<element name=f1 type=nme:int />
<element name=f2 type=nme:long />
</sequence>
</complexType>
<complexType name=RecordCDR>
<complexContent>
<extension base=this: BaseCDR>
<sequence>
<element name=f3 type=nme:string />
<element name=f4 type=nme:string />
</sequence>
</extension>
</complexContent>
</complexType>
The resulting RecordCDR NME type has 4 attributes: f1, f2, f3 and f4.
The Beans and NME XSD language provides support for standard XSD documentation. The following
XML listing below shows an example that for namespaces, types, and fields, documentation
definitions can be supplied using the <annotation> and <documentation> elements.
<complexType name="OneOfCIBERRecord">
<annotation>
<documentation>
This is the type description.
</documentation>
</annotation>
<sequence>
<element name="record" type="CIBERTypes:CIBERRecord">
<annotation>
<documentation>
This is the record field description.
</documentation>
</annotation>
</element>
<element name="separatorChar" type="nme:string"/>
<element name="recordType" type="nme:int"/>
</sequence>
</complexType>
On the Design tab, you can edit the XSDfile in the graphical view by double-clicking any of the
<sequence> elements from the corresponding box (which itself refers to the <complexType>
element. This drills down to a further graphical editor for the <sequence> elements.
From here, each box represents the <complexType>'s <sequence> and each nested <element>,
where you can edit the <element> fields by left-clicking and editing the text (corresponding to the
"name" attribute).
Furthermore, you can also change the value of the "type" attribute by selecting a different value
from the drop-down list.
In this view you can also rearrange the order of any <element> in the given <sequence> by left-
clicking and dragging the element up or down the sequence box. You can also click the "int" and
"string" boxes to change boxes to switch the definition of the int and string types.
On any of the Design tab views, select the box representing a corresponding <import>,
<complexType>, <sequence>, or <element>, and then right-click to open a contextual menu where
you can add or insert additional tags.
When finished with any edits, click the back button in the upper left corner to return to the main
Design tab view.
CCF Components
As mentioned earlier, the Codec Layer of CCF is exposed through the eIUMcollector by using the
following main components:
l CCFFileEncapsulator
l CCFFileWriterFactory
CCFFileEncapsulator is an encapsulator that uses CCF for decoding input data into NMEs, and
generates NMEAdapters (such as CCFFileWriterFactory). The format of the input data is defined by
format definition (XFD) descriptors, described in "XFD Syntax Reference" (on page 157). Meanwhile,
the mapping of decoded data into NMEs is defined by the Transformations descriptors, described in
"Transformations Syntax Reference (TX)" (on page 199). The CCFFileEncapsulator can decode all
supported data formats (text, raw binary, and XML). The XFD and Transformations descriptors can
be referenced as a file-system URI or an absolute path to the eIUM repository server (see the
CCFFileWriterFactory is a part of a datastore that uses CCF for encoding NMEs and placing them
into storage in the required format (storing the structured NMEs into binary or text files). The
output format is defined by the XFD descriptor. Meanwhile, the Transformations descriptors specify
which NME attributes are to be encoded and stored. CCFFileWriterFactory can store NMEs in all data
formats (text, raw binary, and XML). The XFD and Transformations descriptors can be referenced as
file-system URI or absolute path to the eIUMrepository server (see the FormatDefinitionFile and
MapDefinitionFile attributes of the component). CCFFileWriterFactory allows CCF to be controlled by
means of its own configuration as well.
The RepositoryContentLoader component can be referenced from a collector and session server
configuration, allowing the loading of content (that is, directory paths) from the repository server
into a collector's %VARROOT% directory at run time.
For additional information about these components, to include their attributes and sample
configurations, see the eIUMComponent Reference.
Usage Scenarios
The following are some typical usage scenario descriptions:
You have an NME Schema and need to create the XFD format, and then link it with the NME Schema by
Transformations.
1. Launch IUM Studio and perform a repository server checkout. As a result, content from the
repository server will be checked out into
"%VARROOT%/apps/IUMStudio/RepositoryServer/datamodel", and a new project will be created
and displayed in the "Checked out projects" pane. The project contains the required
datamodel/nme/3GPP/3GPP-model.xsd file, for example, which is stored locally.
2. Select File -> New -> XFD File to create the new (XFD) Format Definition File, located in
%VARROOT%/apps/IUMStudio/RepositoryServer/datamodel/format/CDR-format.xfd, and
modify it with the Format Definition Editor for XFD files.
3. Select File -> New -> Transformation to create the new Transformations definition file, located
in %VARROOT%/apps/IUMStudio/RepositoryServer/datamodel/transform/CDR-transform.xml,
to map the format from CDR-format.xfd into the required NME type defined in 3GPP-
model.xsd. The created CDR-transform.xml file will contain references to the format and the
NMEType. You can then edit the CDR-transform.xml file in the Transformations Editor.
4. Use IUM Studio to validate the files and check them into the repository. IUM Studio validates
CDR-format.xfd, CDR-transform.xml, and 3GPP-model.xsd, and then uploads all the new
files into the repository server so they can be used by other eIUMprocesses.
5. Run the Launchpad and create a new collector using the CCFFileEncapsulator.
6. Update the configuration of CCFFileEncapsulator with links to the format and transformations
files in the repository: ccf/format/CDR-format.xml and ccf/transform/CDR-transform.xml.
The link to datamodel/nme/3GTPP/3GPP-model.xsd should be configured as a part of the
collectors NMESchemaLoader configuration. For more information on these components, see
the eIUM Component Reference.
NOTE: You can also use the XFD to XSD conversion wizard to achieve these steps. See "Using
the XFD-to-XSD Wizard" (on page 190) for more information.
You have an external XML definition and need to create the Format Definition (XFD), Transformations
(TX), and XSD descriptors.
1. After launching IUMStudio, execute the xfdtool's xsd2xfd command to convert the given
Mobile.xsd definition into XFD format and create as output Mobile-format.xfd.
2. Launch IUM Studio and perform a repository server checkout. As a result, content from the
repository server will be checked out into
"%VARROOT%/apps/IUMStudio/RepositoryServer/datamodel", and a new project will be created
and displayed in the "Checked out projects" pane. The project will contain "datamodel/beans",
datamodel/nme, datamodel/format and datamodel/transform directories created locally.
3. Copy the Mobile-format.xfd created by xfdtool into the
%VARROOT%/apps/IUMStudio/RepositoryServer/datamodel/format folder in IUM Studio.
Launch the File -> New -> Convert XFD to XSD wizard to generate default Transformations and
XSD descriptors for datamodel/format/Mobile-format.xfd.
1. Launch IUM Studio and perform a repository server checkout. As a result, content from the
repository server will be checked out into
"%VARROOT%/apps/IUMStudio/RepositoryServer/datamodel", and a new project will be created
and displayed in the "Checked out projects" pane. For example, the project will contain the
following files created locally: datamodel/nme/GatewayLog/GatewayLog-model.xsd,
datamodel/format/GatewayLog-format.xfd, and datamodel/transform/GatewayLog-
transform.xml.
2. Modify the GatewayLog-format.xfd file using the Format Definition Editor for XFD files.
3. Use IUM Studio to validate the files and check them into the repository. IUM Studio validates the
GatewayLog-format.xfd, GatewayLog-transform.xml and GatewayLog-model.xsd files.
4. Validation would fail if changes in the XFD have impact on Transformations, which would need
corresponding changes as well. In this case, IUM Studio will report the issue in the Errors Log"
and "Problems" views with detailed descriptions for expected parsing.
5. In case the NME Schema changes during any transformations adjustments, IUM Studio displays
the appropriate warning that the business logic rules may require corresponding changes too.
6. When validation is completed without errors, IUM Studio then uploads the updated materials
into the repository server, which can be accessed by other IUMcomponents as necessary to use
the new changes.
Also see "Format Definitions in IUMStudio" (on page 166) and "Transformation Definitions in
IUMStudio" (on page 225) for more information on working with the IUM Studio Format Definitions
and Transformation Definitions interfaces, respectively.
Creating Reports
eIUM includes integrated web-based application reporting that provides valuable insight into usage
data in your eIUM deployment. This topic series provides an overview of the reporting web
application, describes its key features, and provides guidelines for using it effectively.
Overview 278
Architecture 287
Overview
The eIUM Reporting web application enables you to create reports based on data in your eIUM
deployment quickly and easily. Using its web-based interface, you can create most of the common
tabular or graphical reports without having to purchase an expensive third-party database or
reporting package.
The reporting web application enables you to perform the following operations:
Reporting Components
The eIUM Reporting web application consists of three major components:
l Report Collector: Obtains data from eIUM collectors and stores the report data in a database.
eIUM Reporting provides two templates of pre-configured report collectors:
n Report Simple: Generates reports over a single specified time interval. You might use this
Report Types
eIUM reporting enables you to create several types of reports:
l Summary: Displays the values of a selected parameter sorted in the order you specify. A table of
this report type has at least three columns: a time column, a parameter (dimension) column, and
a measure (sum) column. The report calculates the measure and sorts the results. You might
generate a report of this type to view the top ten source IP addresses for the day.
l Multiple Parameter Summary: Displays the values of several parameters in a single graph. You
can have as many parameters as you want. But as the number of parameters increases, so does
the database size, and consequently the time for queries and the amount of storage space
needed. A table in this report type has at least three columns: a parameter column, a measure
column, and a time column. You might generate a report of this type to view the top five source-
destination IP pairs based on usage.
l Timeline: Displays the values of a variable at selected time intervals, allowing you to see the
behavior of that variable over time. The complexity of this report depends on the configuration
of the source collector. The report has at least three columns: a variable column, a measure
column, and a time column. To group multiple variables, you might create an NME attribute in
your collector that adds a field to provide the group value. You can then select that value in the
report query. You might generate such a report to view the hourly data flow through a router.
l Multiple Timeline: Displays the values of two or more variables on the same graph. The
complexity of this report depends on the data obtained from the source collector. For example,
you may want to report the values of two NME attributes say, attr1 and attr2and their total.
To do this, you can define the NME of the report collector to consist of attr1, attr2, and
total attributes and use rules in the collector to populate these attribute values. You can then
select the multiple timeline report type to create a report displaying all three values on a single
graph.
l Individual Statement: Displays the raw data for a collector. It does not sum the usage data in
each time interval, as in timeline reports.
l Multiple Parameter: Displays reports with primary and secondary parameters.
l Multiple Parameter Pie Chart: Displays primary and secondary parameters in a pie chart.
l Data Table: Displays parameters, measures, and time fields in tabular form.
Report Parameters
You can the determine content and customize the appearance of your report by selecting and
specifying the following report parameters:
l Report Title: The title of the report. The report title is also used to name the file containing the
report configuration. Choose the title carefully as report titles that are extremely long may
cause problems and those that contain illegal characters for filenames may not be recoverable.
l Usage Parameters: Usage parameters are NME attributessuch as account number, login ID, IP
address, port number, bytes, or packetsthat constitute a report.
l Usage Measure: A usage parameter (NME attribute), such as NumBytes, whose values can be
summed.
l Time: A time-based NME attribute such as StartTime or EndTime.
l Time Period: The duration that the report covers. For example, one hour or one week.
l Graph Type: The presentation style of the report, such as horizontal bar chart, vertical bar chart,
or pie chart.
l Top N: The number of values of a usage parameter to include in the report. For example, to
generate a report showing the top five Destination IP addresses, specify 5 as the Top N and
Destination IP as the Report Usage Parameter.
NOTE: The list of usage parameters and usage measure depend on the NME attributes available
to the report collector, which depend on the NME defined for the source collector.
Basic Reporting
Using the web-based interface, you can quickly perform the following tasks to obtain a useful report
on the data collected in your deployment:
l eIUM is installed.
l eIUM Reporting web application is activated.
l At least one collector in your eIUM deployment must have the ability to be queried. That is, it
must be configured with the JDBCDatastore or FileJDBCDatastore component.
Refer to the Installation Guide for instructions on installing and activating the eIUM Reporting web
application.
1. In Launchpad, in the deployment pane or the deployment map, select the Web Application
Server (the Web Application Server is on the host where you activated eIUM Reporting).
2. Click Actions -> Start Web App Server.
1. In LaunchPad, select File -> New or click the new collector icon in the toolbar.
2. Select a factory template. The list of pre-configured collector templates is displayed.
3. Select Simple Report Collector to create a report collector that generates reports over a
single specified time interval or select Advanced Report Collector to create a report collector
that generates multiple reports over several time periods.
4. Click Next. The collector setup pane is displayed.
5. Specify the host on which the report collector should run, the name of the collector, its
description, the name of the source collector, and the name of the source collectors scheme.
6. Verify the default datastore configuration.
7. Click Create.
8. Start the report collector from Launchpad.
1. In Launchpad, select Tools -> Web Applications. This launches the web browser and loads the list
of eIUM Web Tools configured for your deployment. If the browser does not launch
automatically, run the browser and enter the URL: http://<hostname:port>/reporting, where
hostname refers to the system on which the eIUM Reporting web application is running, and
port is the default (8159) or the port number you specified during activation.
2. Click New Report Collector at the upper right of the screen. The left pane displays a directory
tree of the hosts in the deployment.
3. Select a collector and click on a scheme. The Report Collector Creation screen is displayed.
4. In the Report Collector Creation window, specify whether the report collector is for use by eIUM
Reporting or an external reporting package. If you choose to create a report collector for an
external reporting package, the report data is stored as standard SQL types that can be
queried by an external application.
5. Specify a name for the report collector.
6. Specify the usage parameters, usage measure, and time and click Next. The Report Collector
Properties window is displayed.
7. Select the default values or enter new properties. Refer to the online help for details about
each property.
8. Click Create to create the collector.
9. Start the report collector via Launchpad.
Create a Report
Creating a report involves selecting a report collector, specifying the collector properties and graph
options, and saving them in the form of a template. You can later generate (run) reports based on
this template. To create a report:
1. In Launchpad, select Tools -> Web Applications. This launches the web browser and loads the list
of eIUM Web Tools configured for your deployment. If the browser does not launch
automatically, run the browser and enter the URL: http://<hostname:port>/reporting, where
hostname refers to the system on which the eIUM Reporting web application is running, and
port is the default (8159) or the port number you specified during activation.
2. From the eIUM Reporting home page, click Create. The Collector Selection window is displayed,
listing only report collectors (collectors in your deployment that can generate reports).
3. In the collector selection window, select a report collector and click Next. The Database Table
and Report Type Selection window is displayed.
4. Select a database table and report type, and click Next. Refer to the online help or "Report
Types" (on page 279) for a description of each report type. The Report Parameters window for
that report type is displayed. This window contains parameter fields specific to the chosen
report type.
5. In the Report Parameter window, specify the parameter values. Refer to the online help or
"Report Parameters" (on page 280) for a description of each parameter.
6. Some reports allow you to customize the graph output. To do so, click Set graph options. The
Run Reports
To populate the report based on your specifications with usage data:
Advanced Reporting
The reporting tool can provide valuable insight into the data collected in your eIUM deployment
when you use the tool with an understanding of its architecture and take advantage of its flexibility.
eIUM Reporting, which receives eIUM data as input and produces reports as output, consists of three
major components as shown in the following figure:
Java Servlet
Server
IUM Report
Data Collector IUM Reporting
Web Application
l The power of the reporting tool lies in its tight integration with eIUM. The reporting tool relies on
collectors to capture data from network elements, reduce this mass of data to a manageable
size, and store the data so that it can be directly used by the reporting tool. The tool takes
advantage of a collectors aggregation capability to save data storage space. It also takes
advantage of the variable flush time of collectors to construct report time spans.
l The flexibility of the reporting tool lies in the report templates that it provides in the form of
report types. By selecting a report type, you can define the manner in which eIUM data is to be
queried. Also, by specifying report parameters, you can define the way in which the results of the
query are to be presented. The web application server uses the Java Server Pages (JSP)
technology to display the report. You can easily customize its look-and-feel by editing the JSP
file.
The following subsections discuss these issues in detail.
Architecture
The architecture of the reporting tool is best illustrated by a sample eIUM deployment. Consider a
model deployment consisting of a usage collector, a session collector, and a correlator, as shown in
the below figure.
The usage collector obtains usage data from a network element and populates the following NME
attributes: source IP address (SrcIP), destination IP address (DstIP), destination port (DstPort),
number of bytes (NumBytes), and end time (EndTime). Typically, the usage collector stores data in
the binary format for speed and efficiency.
Similarly, the session collector obtains data from a session source and populates the following NME
attributes: login ID (LoginID), account number (AcctNbr), source IP address (SrcIP), start time
(StartTime), and end time (EndTime). The correlator combines records from the usage and session
collectors, and stores the correlated records in its datastore.
Usage
Collector
NME Attrs
SrcIP
DstIP Report Tomcat
DstPort Collector Java Servlet
NumBytes Server
EndTime
Reporting
Application
Report
Correlator
Collector
The report you view depends on the report collector you select, which in turn depends on its source
collector. As the figure shows, the NME attribute values available to a report collector depend on the
NME attributes populated by its corresponding source collector.
You can take advantage of a collectors ability to aggregate usage records to save data storage
space or prepare the records for consumption by the reporting tool. You can employ several rules in
a collectors aggregation scheme to reduce the number of records stored. For example, one rule
might look for well-known ports in the source port field. If found, the rule swaps the destination port
and destination IP address with the source port and source IP addresses, effectively halving the
number of usage records. Another rule might condense ranges of IP addresses into one IP address,
allowing you to put all the usage of a customer under one IP address or show all the traffic going
through one router.
Each report collector is configured with an external JDBC datastore, set up to write to the database,
as shown in the following figure.
The reporting tool also takes advantage of the variable flush time of eIUM collectors to construct
time spans in reports. Each report collector can have a distinct flush time and aging policy. One
report collector may copy NMEs directly into the database in five-minute intervals. The other report
collector might aggregate the data further and flush to the database once every hour.
When you create a report via the reporting interface, the web application server obtains the list of
report collectors available (every collector with an external JDBC datastore) from the configuration
server. For each report collector, it also obtains the NME attributes available to that collector.
When you select the report collector and report type, and specify the report parameters and graph
options via the reporting interface, the web application server saves your specifications as an SQL
query against the database. The query serves as a template. You can then run reports based on the
template.
For example, a summary report takes the form of the following query:
When you run a report, the report engine queries the database to obtain a report based on dynamic
usage data, and then presents the report in the graphic form that you selected (for example, pie
chart or bar chart).
For example, a multiple parameter summary report based on SrcIP and DstIP is as follows:
This query produces a report showing the top source and destination IP combinations according to
reportcollector_1 within the specified time range (12/13/01 9:32 AM - 12/13/01 10:32 AM).
In summary, the type of report you can view depends on the report collector you select and the
report collector. You can employ rules in a collector to process the data and specify the flush
interval to control its flow so that it can be used for reporting. Finally, you can define the report such
that it presents the values of NME attributes available to that report collector in insightful ways.
l Change the host configuration, which affects all processes running on that host, according to the
instructions described in "Managing Host Systems" in the eIUM Administrators Guide.
l Override the host configuration according to the instructions for "Overriding Default Host
Properties" in the eIUM Administrator's Guide.
l Windows: C:\SIU\var\webappserver\webapps\reporting\en_US\run\ReportForm.jsp
l UNIX: /var/opt/<SIU_instance>/webappserver/webapps/reporting/en_US/run/ReportForm.jsp
Introduction 293
AuditAdornmentRule 312
Cautions 313
Introduction
The convergence of voice and data traffic and of wireline and wireless networks presents service
providers with some difficult challenges as well as attractive revenue opportunities. As profits from
traditional communication services diminish, providers must offer new, value-added services to
ensure profitability. More importantly, providers must be able to bill their customers in flexible
billing models, quickly and accurately.
Many providers have the desire and the ability to offer new, consolidated voice and data products
with bundled discounts and one-rate packages combining different services. To pull these services
together, however, service providers must combine components from several different partners,
suppliers (switch vendors, gateway vendors, billing vendors, and so on), and their own internal
systems. Integrating distributed, product-oriented systems with new customer-oriented systems is
a challenging problem for which the eIUM software provides a solution.
The eIUM usage mediation and management platform supports pre-paid and post-paid billing
models for wireline and wireless networks carrying voice and data services. eIUM takes advantage
of a scalable, distributed architecture to collect, aggregate, and correlate usage data from your
service infrastructure and present the results to your business support systems for billing or
strategic market analysis.
Revenue Assurance
The complexity of usage-based billing and the management of IP services also underscores the
problem of revenue leakage. Although exact figures of revenue loss are rarely public data,
estimates of 5 to 15 percent of total revenue or of 100 to 200 billion dollars per year are not
uncommon. With so much at stake, stopping revenue leakage is crucial to providing IP services
profitably.
The realization that a significant fraction of potential revenue is being lost has led many
organizations to scrutinize their billing processes and systems. As a result, providers increasingly
recognize the need for an end-to-end revenue assurance program that can ensure the accurate
metering and billing for service usage in this heterogeneous, distributed environment. Revenue
assurance is the set of organizational processes designed to verify the completeness, accuracy, and
integrity of the capture, recording, and billing of revenue producing events.
Complete revenue assurance programs involve the participation of every department affecting the
revenue cycle, including product development, pricing strategy, sales and marketing, network
management, prepaid services, customer care, fraud and churn management, provisioning,
receivables management, accounting, and reporting. This comprehensive view of revenue assurance
is an ambitious goal for providers that are just beginning to develop such a program in their
organizations.
To deploy a complete revenue assurance solution, the organization must typically coordinate
several complex yet fundamental processes:
l An audit process to maintain data integrity, avoid data loss, and provide business intelligence for
product planning.
l An error recovery process to repair incomplete or corrupt usage data and process the corrected
data in order to retrieve billable events from otherwise unusable records.
l A testing process to originate test calls that validate the record processing end-to-end, from the
switch to the billing system.
l A profile analysis process to compare the actual workload against the expected workload and
billing profiles, and warn of discrepancies.
l A predictive analysis process to predict the evolution of the system from end to end, and assess
the impact of future changes by combining usage and audit information with market research.
l A billing verification process to ensure that customers were billed according to their service
agreements for all the services used.
l A real-time analysis process to monitor incoming usage information in order to detect fraud and
manage prepaid calls.
Auditing and error recovery are the two cornerstones of any revenue assurance strategy because
they make all the other processes possible. Without auditing, you cannot find revenue leakages
between processes and systems. Without error recovery, you cannot repair the revenue leakages
you find.
The eIUM audit subsystem serves as the foundation of your revenue assurance strategy by
supporting both auditing and error recovery processes. The audit subsystem enables you to
generate accurate and complete bills that can withstand an external review or a customer
challenge.
Auditing Basics
Simply put, the eIUM audit subsystem works like a surveillance camera; it starts monitoring only
when you turn it on and then runs continuously in the background. You can decide what to record
and how to store the data. The stored data represents an audit trail that you can later query and
analyze to inform your business decisions.
l A dataset is a set of usage records related by a natural boundary such as the end of an input file
or a time-based data flush. The notion of datasets enables the audit subsystem to track
meaningful batches of usage data as they flow through eIUM collectors.
l An audit point is a programmatic hook in a collector component that represents the site at
which audit data can be captured. Audit points enable the capture of collector metrics using
audit operations. When usage data flows into, through, or out of a component that is, when a
usage NME traverses an audit point it triggers audit operations.
l An audit operation extracts a specific metric or performs specific calculations to populate an
audit NME attribute. For example, the audit point in the FilterRule of an aggregation scheme
might trigger the audit operation that counts the number of bytes in usage NMEs filtered out by
this rule. This operation would compound the number of bytes obtained from the filtered usage
NME attribute and store the total in an audit attribute.
l An audit attribute holds a single metric; a set of audit attributes hold audit data in the NME
format just as standard eIUM NMEs hold usage data. An audit NME can only be used for auditing.
The eIUM audit subsystem employs four types of NMEs: Input Source Audit NMEs, Input Dataset
Audit NMEs, Output Dataset Audit NMEs, and Exception Audit NMEs (as explained later in this
chapter).
l An audit rule checks audit attributes to verify the correctness of eIUM usage data processing.
For example, an audit rule may verify that for a given collector, the number of incoming NMEs
equals the number of outgoing (filtered, processed, aggregated) NMEs.
Auditing Overview
The eIUM audit subsystem captures, processes, verifies, and stores such metrics as the number of
NMEs flowing into a collector, the number of NMEs aggregated, NMEs filtered, and NMEs passed on
to a downstream collector or application, and provides tools with which you can query the audit trail,
generate audit reports, and analyze audit data. These processes together constitute the function
known as auditing.
Careful and considered interpretation of audit data is a key part of the auditing function, but you
must also respect the limitations of the audit subsystem. eIUM audit reports can contain detailed
metrics about every input source, collector, and dataset, presenting a huge quantity of data for a
given deployment. However, the data itself cannot provide the context for analysis or produce
meaningful conclusions about revenue leakage. You must interpret and use it along with other
information sources, such as network elements and billing systems, for example, to effectively
prevent revenue loss. Therefore, auditing is a responsibility shared between the audit subsystem
and the audit administrator.
l Enables Auditing
l Monitors Auditing
l Analyzes Audit Reports
NOTE: The eIUM audit subsystem does not check data at the source, before it enters eIUM, or in
the billing system, after the data leaves eIUM. This is best performed by an end-to-end revenue
assurance tool that analyzes the audit metrics collected from the source(s), eIUM, and billing.
The following sections describe the steps involved in performing each task. Subsequent sections
provide detailed background information.
Enable Auditing
The audit subsystem simplifies the task of enabling audit by providing three predefined audit sets:
NMECount, Session, and Correlation. Because these audit sets are common for most deployments,
you need only select them to enable typical audit data collection and verification.
1. In the deployment pane or the deployment map, select the collector for which you want to
enable auditing.
2. From the menu, select Action -> Edit. This displays the Collector Configuration screen.
3. Select the Audit tab.
4. Click on the Audit Enabled check box as shown below. Input source auditing is enabled by
default.
5. Under Dataset Audit, click on the NME Count check box to verify and reconcile the NME counts
for each input dataset processed by this collector (see "Audit Data Processing" (on page 311)
for more details).
6. Under Scheme Audit <scheme-name>, click on the NME Count check box to verify and reconcile
the NME counts for this scheme.
7. Under Scheme Audit <scheme-name>, click on the Session check box to enable session auditing
for this scheme (see "Session Audit" (on page 308)). Enable session auditing only if the
AggegrationScheme performs session processing (uses the SessionMatchRule).
8. Click Apply and then click OK.
9. Restart the collector to apply the changes.
Disable Auditing
To disable auditing, return to the collectors audit configuration screen and click the (checked) Audit
Enabled check box. When auditing is disabled, audit data is no longer collected but existing data is
not deleted.
Monitor Auditing
The eIUM audit subsystem includes an operational audit component that can help you resolve
discrepancies in the audit trail. This component captures such as operational events as switch or
collector unavailability and errors in the source file.
l Collector Log: The collector log file contains various eIUM system messages that refer to errors,
warnings, informational notes, and other operational results. The collector log file also includes
audit attributes and the results of the audit verification processes. The collector log file is
located at C:\SIU\var\log\<collector>.log on Windows NT and at /var/opt/SIU/<collector>.log on
UNIX.
l Audit Log: The audit log file contains audit-related messages such as errors, informational
notes, and results depending on the log level configuration as well as audit data. It only tracks
events relevant to the verification and reconciliation of the audit trail. The audit log file is located
at C:\SIU\var\<collector>\audit.log on Windows NT and at /var/opt/SIU/<collector>/audit.log on
UNIX.
Both logs can be monitored by an automated system, such as OpenView VPO, or by an administrator.
NOTE: The term Aggregated has a more specific meaning in the audit log than in the collector log.
In the collector log, the message Aggregated # NMEs... refers to all the NMEs processed
(merged or filtered) by a scheme. In the audit log, the SchemeNMEsAggregated audit attribute
refers only to the NMEs merged.
Using operational audit involves specifying the log level and viewing the audit log, as described in the
following sections.
1. In the Launchpad deployment pane or the deployment map, select the collector whose audit log
level you want to set.
2. From the menu, select Action -> Set Audit Log Level.
The viewer continuously updates the display of audit data and messages. Check Pause to hold
updates while scanning the current contents of the viewer. Use the search function to find specific
information. For example, type a time of 14:07 in the Enter Search String field, select Down, and
click Find Next to display the first entry. Click Find Next to search for additional occurrences. Check
Wrap Text or use the horizontal scroll bar.
1. In the Launchpad deployment pane or the deployment map, select the collector whose audit
data you want to view.
2. From the menu, select Actions -> Query Data.
3. Under Select a Scheme, select Audit Source Summary from the menu.
4. Select an audit dataset and click View Collected Data. The audit data window shows the
summary, audit source data, and audit exception data for NMEs in the dataset.
You can also use the siuquery tool (from the command line or in a script) to query collectors for their
audit data. The collector must be running, but does not need to be on the local system. This tool
displays NME data in the datastore or in collector memory. The siuquery command has the following
options for querying audit data.
Option Description
-e <dataset id> Specifies the ending dataset or the ending NME time
of a range.
See the eIUM Command Reference for additional information about siuquery.
Audit Points
Audit points are configurable, programmatic hooks that trigger audit operations when usage data
flows through an eIUM collector. Audit points are present at the encapsulator and aggregator
components of a collector, as illustrated in the following figure:
Collector
Aggregator
Encapsulator
Datastore
Audit Points
Audit points are not embedded in the datastore because the eIUM audit subsystem stores audit
data in the datastore, and so it cannot provide an independent review of its operation. Nevertheless,
certain operations of the datastore are written to the audit log. The datastore generates log
messages and operational audit messages about the persistence of usage data to the backing
store and the movement of usage data (due to aging, for example).
Such audit information is stored in the Input Dataset Audit NMEs and Input Sources Audit NMEs as
described in Input Dataset Audit NME and "Input Source Audit NME" (on page 304).
The following audit points collect audit data when usage data enters or leaves the aggregator:
AggregatorPurge To audit metrics from the datasets that are being purged.
An aggregator contains one or more aggregation schemes set up in parallel. The following audit
points collect audit data when the usage data enters an aggregation scheme:
Rules are the primary site at which audit data can be collected. Audit points are embedded in certain
standard rules as shown below:
AggregationRule Create To audit when new NMEs (leaf nodes) are created in the
aggregation tree.
Audit NMEs
The audit subsystem takes advantage of the eIUM NME schema to hold audit information in NME
attributes dedicated to auditing. Audit NME attributes are just like any other NME attributes except
they are used only for auditing. You can also capture information specific to your eIUM deployment
by extending the NME schema with custom audit attributes.
The eIUM audit subsystem employs four types of audit NMEs: Input Dataset Audit NMEs, Input
Source Audit NMEs, Output Dataset Audit NMEs, and Exception Audit NMEs. You can customize the
Input Dataset Audit NME and the Output Dataset Audit NME.
Collector
Input Source
Aggregator
Scheme 1
Scheme 2
Input Source Output
Encapsulator
Input Source
Input Source
Audit NMEs
Exception
Audit
NMEs
IUM 3.1 provided support for only dataset auditing. A collector could gather data from multiple input
sources, but flush occurred at the end-of-file (EOF) for each input dataset file. Accordingly, there
was a one-to-one mapping between the input source and the input dataset audit NME. In contrast,
IUM 4.0 supports time-based as well as dataset audit configurations, so there may be one or more
input source audit NMEs per flush.
DatasetSourceType An integer value indicating the type of the input data source as follows:
l 0: Unknown
l 1: Another collector
l 2: A file
l 3: Network source (for example GTP)
l 4: Demo Encapsulator
SourceStart Byte offset to the start of the input file or the start time for the flush set
SourceEnd Byte offset to the end of the input file or the end time for the flush set
NOTE: The audit subsystem supports source audit for file and collector sources but not network
protocols, with the exception of the GTP protocol.
DatasetID A unique integer representing the dataset or flush set, incremented by 1 for
each new flush
DatasetNMEsIn The number of NMEs that were sent to the aggregator for the current
dataset or flush set. This attribute is available only if the NMECount audit set
is selected.
Info The name of the file that contains the audit usage information.
If auditing is enabled, there is always one input dataset audit NME per flush.
SchemeNMEsIn The number of NMEs that were received by the aggregation scheme for
the current dataset.
SchemeNMEsAggregated The number of NMEs in the dataset that were aggregated, or merged
with other NMEs.
SchemeNMEsCreated The number of NMEs (leaf nodes, not NMEGroups) created in the
aggregation tree by the aggregation scheme.
SchemeNMEsFiltered The number of NMEs in the dataset dropped from processing by the
aggregation scheme.
SchemeNMEsOut The number of NMEs sent out from the aggregation scheme for the
dataset.
For example, if a session logout message was missed, you need to identify exactly which session ID
had a missing logout. If a parse error occurs in the dataset input, you need to know not only how
many parse errors occurred but also where they occurred. Parse errors can be particular interesting
because they usually indicate input source corruption (often due to failing hardware or a bad
configuration). Such errors, caused by unprocessed data, can result in significant revenue loss if
they are not repaired.
Exception audit NMEs capture such information without incurring an excessive processing overhead.
Exception NMEs are created whenever an exception condition is encountered while processing data.
Using the information in these NMEs, you can trace a problem back to the record that caused it.
AuditExceptionID Identifies the exception. For example, ID 5 indicates that there was a
parser error.
AuditExceptionNMEID Identifies the NME context associated with the exception. For example, the
GPRS sequence number and ID of the session record
(<SessionID><SequenceNumber>).
Audit Exceptions
ID Cause AuditExceptionNMEID Class
Audit Operations
An audit operation extracts a metric or performs a calculation to obtain the value of an audit NME
attribute. Audit operations can read usage NME attributes, but not modify them. For example, you
might count all the NMEs filtered out at the FlushProcessor. The audit operation would simply add 1
to an audit NME attribute for each NME filtered out.
where
Audit Operations
Operation Description
In the following example, the audit operation adds the values of the dataVolumeGPRSDownlink
NME attribute from usage NMEs dropped by the FilterRule. The Filter audit point is defined in the
FilterRule. The SchemeVolumeFiltered audit attribute is defined in the NME schema.
FilterAuditOp=
SchemeVolumeFiltered,add,dataVolumeGPRSDownlink
Session Audit
The eIUM session architecture consists of a basic session match rule and session state, which can be
extended by new session match rules and states for new protocols. The audit subsystem supports
session auditing of complex GPRS sessions as well as simple sessions.
Standalone Indicates that a session opened and closed in the duration between record postings.
For example, if a user opened a session, made a phone call, downloaded a weather
report, and then closed the session, all within the duration.
Interim Posted after a fixed time period (for example, every hour) to record current activity
and keep the session open.
Upgraded Created if the current record indicates that a previous record was lost. For example,
if a session open record is lost, then the first record received is an interim record.
That interim record is upgraded to a session open to compensate for the previous
record loss.
Handover When mobile GPRS users move from one SGSN switch to another, this record
indicates the transfer.
The following table lists GPRS Session audit points, implemented in the GPRSSessionState class.
StartUpgrades To audit interim records that have been upgraded to start records
Name Purpose
EndUpgrades To audit interim records per scheme that have been upgraded to end records
Correlation Audit
Correlation is association of incoming usage records with an appropriate session so that the
customer can be billed. A correlating collector uses either CorrelatorMatchRule or
RangeCorrelatorMatchRule depending on whether the session is defined by a single IP address or a
range.
If auditing is enabled, the audit subsytem uses the following audit points for each rule:
Name Purpose
These counts are compared during audit verification, as described in the following section.
l Checks usage data and audit information to validate and reconcile the information and generate
operational audit log entries
l Applies a rule chain to the audit NMEs in order to perform additional validation or adornment
before passing it to the datastore
l Resets the dataset, source, and scheme audit attribute values after they are persisted to the
datastore
Audit Verification
In addition to collecting and reporting audit data, the audit subsystem can also verify that the usage
data was processed correctly using audit rules. You can also create new rules to customize the
audit subsystem.
One such audit rule verifies the number of NMEs flowing through each aggregation scheme. When
the NMECount audit set is selected during configuration, the audit subsystem verifies that the
following equation is true and logs a warning if false:
I=F+A+D
You can create a custom audit rule to do the same for session collectors.
Another audit rule verifies the number of NMEs through the correlator. When the Correlation audit
set is selected during configuration, the audit subsystem verifies that the following equations are
valid and logs a warning if false:
If the counts are correct, this information is logged only in the collector's log file. If not, the
information is also logged in the audit log file.
AuditAdornmentRule
In addition to the verification rules, the audit subsystem provides the AuditAdornmentRule
component, which enables you to insert a custom audit point in a rule chain and collect audit metrics
and generate log messages.
AuditAttributeName The audit attribute name representing the information you want to
collect. For example: MissingLogins. The attribute name must be in the
NME schema.
LogMessagFormatString The format of the log message to be generated. For example: Login
+SessionID+ +%DATESTAMP
Optional
Optional
Default: INFO
Default: MMddyyHHmmss
The following configuration example shows how to configure the AuditAdornmentRule to increment
the DroppedNMECount audit attribute value:
[/collector/Aggregator/scheme0/AuditAdornmentRule]
ClassName=com.hp.siu.collector.rules.AuditAdornmentRule
AuditAttributeName=DroppedNMECount
AuditPointName=MyAuditPoint
LogMessageFormatString="NME + ID + was dropped
LogLevel=INFO
The rule also generates an audit log message at the INFO level.
The datastore ordinarily creates one backing store for each scheme in order to store usage data. If
auditing is enabled, the datastore creates two additional backing stores (auditSrc and audit_ds) to
manage global audit statistics such as source file name, number of records processed successfully,
number of records with errors, and so on. The stores are transactionally updated at flush time.
The datastore generates log messages and operational audit messages about the persistence of
usage data to the backing store and the movement of usage data.
In general, audit data should age at the same time or later than usage data. The audit subsystem
supports two aging policies for audit data:
Cautions
l Table rolling is not encouraged with auditing because it can corrupt the audit trail.
l If you use aging based on the number of datasets or on End Time for audit data, you must use
the same aging policy for usage data.
l Do not set the AuditAgeLimit lower than the TableAgeLimit.
Audit Tables
Every collector in a deployment has a history table in the database for each aggregation scheme as
shown in the following figure. The history table is used internally by eIUM to facilitate querying and
aging. The history table contains metadata about the database tables or files that store the NMEs.
The history table holds information such as the start and end time of the dataset, the dataset flush
time, the dataset identifier and so forth. Each row in the history table holds information about one
dataset. The history table records when each flush occurred and in which file or database table the
flushed data resides. The history table is an internal table that has no external configuration
options.
When audit is turned on for the collector, the existing history table is expanded to include a few
more columns that hold auditing information as shown in the next figure. The number and type of
additional columns depends on the type of auditing that is enabled. "Audit Data Added to Collector
History Tables" (on page 316) describes the columns added to the history tables when audit is
enabled for the collector.
Enabling audit also creates two additional internal aggregation schemes in the collector as shown in
the following figure. These two internal schemes have no external configuration options. They are
self-configured and hold business logic to enable auditing. Similar to how the history tables are
created for every aggregation scheme in a collector, two additional history tables are created for
the internal audit schemes when audit is turned on as shown below.
l <CollectorName>_AUDITSRC_HISTORY
l <CollectorName>_AUDIT_DS_HISTORY
For example, in the above figure, the audit history tables would be named C1_AUDITSRC_HISTORY
and C1_AUDITS_DS_HISTORY. The naming convention, the aging behavior and scope of the two audit
history tables is similar to that of the history tables created for the collector's aggregation
schemes. The contents of these audit history tables is described in "Audit History Tables" (on page
315). The additional columns of audit data added to the regular aggregation schemes is described in
"Audit Data Added to Collector History Tables" (on page 316).
The tables are not dependent on the type of auditing that is enabled. The two audit history tables
that are created when audit is turned on are named as follows:
l <CollectorName>_AUDITSRC_HISTORY
l <CollectorName>_AUDIT_DS_HISTORY
The <CollectorName>_AUDITSRC_HISTORY table contains the following information:
INFO Path where the NME file containing the audit NMEs for the dataset are VARCHAR
stored. The NME attributes are EndTime, StartTime, DatasetSourceType,
DatasetSourceInfo, SourceNMEsIn, SourceStart, SourceEnd, SourceEOF.
INFO Path where the Audit_DS_NME file is stored. The NME file holds the VARCHAR
audit NME schema. The NME attributes are EndTime, StartTime,
AuditExceptionNMEId, AuditExceptionId and AuditExceptionSource.
SOURCESNUMIN Specifies the number of data sources from which the input NMEs enter INTEGER
the scheme.
DATASETNMESIN Specifies the number of NMEs or records that were present in the INTEGER
particular dataset that was flushed.
NOTE:The column DATASETNMESIN is added to the AUDIT_DS_HISTORY table only when a specific
type of audit called the Dataset Audit - NME Count is enabled. This column specifies the number
of NMEs or records that were present in the particular dataset that was flushed.
l Dataset Audit provides audit information on each dataset that enters the collector.
l Aggregation Scheme Audit provides audit information on each NME that enters and exits each
aggregation scheme.
The information added to each aggregation schemes history table depends on which type of audit
is enabled.
l NME Count - Provides the number of NMEs at different stages of processing, such as the number
of NMEs that enter the scheme and the number of NMEs filtered, aggregated, duplicated and so
forth and then flushed out.
l Session - Provides audit metrics for session collectors, such as all sessions opened, closed,
dropped and duplicated.
l Correlation - Provides audit metrics for the session NMEs and usage NMEs which are correlated
or uncorrelated in a correlator collector.
Each of these audit types can be enabled or disabled separately for each aggregation scheme. The
information added to each aggregation schemes history table depends on which type of audit is
enabled. The figure below shows a portion of the Launchpad with these three types of audit for two
aggregation scheme named StoreData and AggregateData. You display this screen by double
clicking on a collector in the Launchpad and selecting the Audit tab.
This type of audit provides the number of NMEs at different stages of processing, such as the
number of NMEs that enter the scheme and the number of NMEs filtered, aggregated, duplicated
and so forth and then flushed out. The aggregation scheme NME count audit is enabled by default
when auditing is enabled in the collector. This can be turned off by deselecting the option next the
NME Count (General) under the Scheme Audit <aggregation scheme name> panel of the
Launchpad, as shown in the screen above. When this Scheme Audit - NME Count is turned on, the
additional columns shown in the table below are added to the aggregation scheme's history table.
These are all INTEGER types which indicate the NME count at the end of processing through all the
rules in that scheme.
SCHEMENMESIN The number of NMEs that entered the scheme for processing. INTEGER
SCHEMENMESADDED The number of NMEs that were added to the existing NMEs. INTEGER
SCHEMENMESFILTERED The number of NMEs that were filtered out by the FilterRule or INTEGER
dropped by a ConditionalRule.
SCHEMENMESCREATED The number of NMEs, if any, that were created due to some INTEGER
condition in one of the rules.
SCHEMENMESOUT The number of NMEs that were actually sent to the datastore, INTEGER
taking into account all the additions and deletions of NMEs while
traversing through the rule chain.
This provides audit metrics for all sessions opened, closed, dropped and duplicated. Session audit
can be turned on only for session collectors, which are collectors with a SessionMatchRule,
SimpleSessionState and so forth. You turn on session audit by selecting the Session (General) box
under the appropriate aggregation scheme (IPRangeSession in this case) in the Launchpad as shown
below.
When session audit is enabled as shown above, the columns described in the table below are added
to the history table of the collector's aggregation scheme.
SESSIONMISSINGLOGINS Session logouts that occur without a login. These logins INTEGER
are stored as missing session logins.
SESSIONMISSINGLOGOUTS Session logins that occur without a logout after it. INTEGER
These missing logouts are stored in this column.
SESSIONDUPLICATELOGINS Duplicate logins for the same session (without a logout INTEGER
in between).
This provides audit metrics for the session NMEs and usage NMEs which are correlated or
uncorrelated in a correlator collector. Correlation audit works only for collectors that have two
correlated input sources, which is a collector with a CorrelatorMatchRule or a
RangeCorrelatorMatchRule.
You turn on correlation audit by selecting the Correlation (General) box under the appropriate
aggregation scheme (Correlated in this case) in the Launchpad as shown below.
When correlation audit is turned on as shown above, the following columns are appended to the
history table of the collector's aggregation scheme:
Customizing Audit
You can customize the eIUM audit subsystem to gather custom audit information and perform
verification operations specific to your deployment. Customizing the audit subsystem involves
extending its collection and processing capabilities.
l Analyze the audit data from the standard audit configuration and determine the additional audit
metrics that you want to collect.
l Based on the metric, select the audit NME type that is best suited to hold this information. Note
that you can extend the Input Dataset Audit NME and the Output Dataset Audit NME, but not the
Input Source Audit NME or Exception Audit NME.
l Specify the NME attributes that will hold the custom information. Audit attribute names must be
unique across all audit NMEs. For example, you cannot use the same attribute name in the Input
Dataset Audit NME and the Output Dataset Audit NME. Doing so will cause a configuration
exception. Existing NME attribute names are also reserved for use by eIUM.
l Extend the NME schema by adding the custom audit attributes.
l Determine the audit point at which the metrics are to be collected and the audit operation that
will obtain this information. Modify the collector configuration by adding the audit operations and
restart the collector.
eIUM provides a preconfigured collector called the Audit Report Server that gathers audit data from
audit-enabled collectors. The Audit Report Server ignores collectors for which auditing has not been
enabled.
In order to generate and view audit reports, you must enable the Audit Reporting web application
and create the Audit Report Server. After the Audit Report Server is started, you can use the Audit
Reporting web application to generate and view audit reports on a browser.
NOTE: During activation, the eIUM Activation Wizard prompts you to activate the Audit Reporting
web application. You must select this option on at least one host in your deployment. If you did
not activate the Audit Reporting web application at that time, run the activation wizard again and
select it. Refer to the Installation Guide for detailed instructions.
We recommend that you run the Audit Report Server and the Audit Reporting web application on the
same host. If not, you must edit the configuration of the audit report server collector to include
either its name (if DNS configured properly) or IP address in the Database field as follows:
Database=jdbc:mysql://localhost:3306/siu20
1. In Launchpad, select File -> New or click New Collector. The New Collector dialog is displayed.
2. In the Template Selection pane, select Factory Templates. The table of pre-configured
collectors is populated.
3. Select Audit -- Report Server and click Next.
4. In the Collector Setup pane, select the host on which you want to run the Audit Report Server.
We recommend that you select the host on which you activated the Audit Reporting web
application so that the web application can perform better while retrieving audit data. If not,
you will need to edit the configuration of the audit report server manually.
5. In the Collector Setup pane, specify AuditReportServer as the name of the new collector.
6. Click Create and then Close. You do not need to set the collector configuration.
7. In the deployment pane or the deployment map, select the AuditReportServer.
8. From the toolbar, click Actions -> Start, or right-click and select Start.
You can also use the Audit Reporting web application to create an Audit Report Server. However, you
cannot use the Audit Reporting web interface to start it. You must return to Launchpad to start the
Audit Report Server, or you can use the Operations Console to start the process. See the eIUM
Operations Console User Guide for more information on starting and stopping processes.
CAUTION: We recommend that you run only one Audit Report Server in your deployment. Running
more than one Audit Report Server can cause conflicts in the database tables.
The Audit Report Server is now collecting audit data from audit-enabled collectors in your
deployment. The Audit Report Server must typically run for several hours in order to collect
sufficient data. After it has collected enough data, you can generate and view audit reports as
shown in the following sections.
3. Specify the day for which you want to view the report.
4. Select one or more report types. See the following sections for details.
5. Specify the format of the report.
6. Click Run.
Exception Report
The exception report shows the exceptions encountered during audit data collection or processing,
as shown in the following sample:
Correlation Report
The correlation report shows audit data from all the audit-enabled correlation collectors in your
deployment, allowing you to monitor the status of uncorrelated NMEs.
Inter-Collector Report
The inter-collector report shows audit information about inter-collectors (intermediate collectors in
a hierarchy) and their status relative to the leaf collectorsnumber of NMEs by which it lags, and is
late or early.
Session Report
The session report shows audit data from all the audit-enabled session collectors in your
deployment, as shown in the following sample:
1. In Launchpad, select Tools -> Web Applications. This launches the web browser and loads the list
of eIUM Web Tools configured for your deployment. If the browser does not launch
automatically, run the browser and enter the URL: http://<hostname:port>/auditreports, where
hostname refers to the system on which the Audit Reporting web application is running and
port is the default (8159) or the port number you specified during activation.
2. Click Home and then click eIUM Audit Reports.
3. In the eIUM Audit Reports page, click Create.
4. In the Audit Report Selection page, select a report type and click Next.
1. In Launchpad, select Tools -> Web Applications. This launches a browser and loads the list of
eIUM Web Tools configured for your deployment. If the browser does not launch automatically,
run the browser and enter the URL: http://<hostname:port>/auditreports, where hostname
refers to the system on which the Audit Reporting Web application is running and port is the
default (8159) or the port number you specified during activation.
2. Click Home and then click eIUM Audit Reports.
3. In the eIUM Audit Reports page, select a report title from the list.
4. In the calendar, select a day, a week, or a month. The selected period is highlighted.
5. Click View Report.
6. When the report displays, click Data, Print, or Export Data for additional operations.
For information on how to centralize log messages using HP OpenView, see the Logging chapter of
the HP eIUM Administrators Guide.
l Log file access: eIUM component (collectors, Admin Agent, Configuration Server) log file
messages are collected, processed, filtered and presented as events in the OVO Message
Browser.
l Process monitoring: eIUM components notify the OVO operator of termination or restart of eIUM
components. Corrective operator-initiated and automatic actions are available for specific
events.
l Administrator access: A special operator ium_op is created for access to eIUM management
functions and the eIUM Launchpad is placed in the OVO Application Bank, allowing access to eIUM
management functions to be restricted to specific operators.
HP eIUM-OVO integration uses the following mechanisms:
l Merging of eIUM log file information: In typical eIUM-based IP mediation systems, several eIUM
collectors run on the same host. The log file merger tool siulogmerger automatically discovers
which eIUM components are running on the host, opens these logs, converts log file formats, and
merges all appropriate information into a single file that can be read by the OVO agent running
on that host. The OVO agent then forwards the resulting events to the OVO Management
Console.
l HP eIUM collectors and configuration server run-time monitoring: The eIUM host admin agent
controls the run-time operations of all eIUM components (start, stop, restart, and so forth) and
monitors collector run-time status. The admin agent can execute an external script whenever
run-time status changes. Monitoring scripts are provided that notify OVO of eIUM component
status changes. These scripts run the OVO opcmsg command.
l HP eIUM Admin Agent monitoring: The Admin Agent is monitored separately via the iumadm_
chk.sh script and OVO templates.
l Pre-configured operator initiated actions: OVO template files include specific corrective actions
that can be performed by OVO/eIUM operators.
l eIUM application group. eIUM Application group contains just one application called Launchpad.
With Launchpad, the OVO/eIUM operator can control eIUM collectors (for example, start, stop,
restart, get status and statistics). This application runs the /opt/SIU/OV/guistart script which in
turn starts the eIUM LaunchPad at /opt/SIU/bin/launchpad. This script may be modified as
needed (such as specifying an alternate X Windows display host by exporting a DISPLAY variable
before the LaunchPad is executed).
A OVO agent must be running on the eIUM node for monitoring by OVO to take place (that is, the
eIUM node must already be a OVO-managed node).
To start siulogmerger and create the proper log file, use the following command:
/opt/SIU/bin/SIUJava com.hp.siu.tools.siulogmerger -o
/var/opt/SIU/log/IUMMonitor.log
You should add this command to a local boot script so it is started after all eIUM components each
time the system boots. When adding to a boot script, we also recommend using the nohup
command to start it by preceding the above command with nohup (see the nohup man page on
UNIX).
1. Copy the appropriate version of the Perl script process.pl to a directory where local system
tools are kept. The HP-UX version is /opt/SIU/OV/hpux.bin/process.pl, the Oracle Solaris version
is /opt/SIU/OV/solaris.bin/process.pl. This script requires Perl be installed on the system. Make
sure the first line of the script refers to the correct location of Perl on this system.
2. Run the eIUM Launchpad and log in if security is installed.
3. Double click on Deployment in the deployment pane to display the hosts.
4. Select the host to be configured.
5. Select the Configure tab.
6. Click on the Edit Host Startup Configuration button. The LaunchPad displays all the parameters
used whenever the host admin agent starts.
7. Select Admin Agent in the left-hand pane.
8. Check the Enable Notify Command check box.
9. Type in the complete path name of the process.pl script (where you installed it, do not run it
directly from /opt/SIU/OV) that you want invoked by the admin agent.
10. Click the OK button.
Note that the OVO Management Console is not required to be the eIUM Configuration Server or even
to be running any eIUM components. However, if eIUM has not been installed on the OVO
Management Console, you will need to copy the /opt/SIU/OV directory from a machine where eIUM is
installed in order to complete the configuration of OVO. If the OVO Management Console is running
eIUM components, then the steps in the previous section should be performed first, just as on all
other eIUM nodes.
NOTE: If the eIUM Configuration Server is different from the OVO Management Console,
modify the /opt/SIU/OV/guistart script on the eIUM Configuration Server to set and export
an appropriate X Windows DISPLAY environment variable before launchpad is executed so
that Launchpad displays on the OVO console.
5. Assign the eIUM Template Group to all hosts running eIUM components using the pull down
menu Actions->Agents->Assign Templates.
1. Copy the appropriate version of iumadm_chk.sh to the appropriate OVO directory for
distribution (/opt/SIU/OV/hpux.bin/iumadm_chk.sh should be copied to
/var/opt/OV/share/databases/OpC/mgd_node/customer/hp/pa-risc/hp-ux11/monitor for HP-
UX nodes and/or /opt/SIU/OV/solaris.bin/iumadm_chk.sh should be copied to
/var/opt/OV/share/databases/OpC/mgd_node/customer/sun/sparc/solaris/monitor for Oracle
Solaris nodes). Use the chmod command to set the mode of the files to 600 and use the
compress command to compress them.
2. Distribute OVO agent software and configuration to managed nodes using the pull down menu
Actions->Agents->Install/Update SW & Config.