[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
A Data collection MIB
Folks,
Hoping to kick off a discussion on a MIB idea that I have been playing
around with for sometime now. I have been in touch with Bryan Levin
and David Battle regarding merging this idea with theirs
(draft-ietf-eos-snmp-bulkdata-00.txt)
We thought it would be best to throw this open to eos.
This MIB is intended to help periodic data retrievals, when the data
itself is a set of discontiguous rows spread across multiple tables.
Likely applications are performance and accounting applications.
For e.g.
The user wants to periodically fetch
- ifInOctets, ifOutOctets from ifTable
- ifHCInOctets, ifHCOutOctets from ifXTable
- dot3StatsLateCollisions, dot3StatsSingleCollisionFrames from
dot3StatsTable.
and is interested only in a set of interfaces, lets say
having ifIndex
1,5,10-12,23-25.
The use of get-bulk to fetch the required object instances would be
inefficient since a lot of unnecessary object instances would also be
retrieved. Also since all 3 tables need not have the same number of
rows, it again may not be possible to use a single get-bulk
request to fetch rows from all 3 tables simultaneously.
The other option is to use get-exact request PDUs specifying the
exact instances *everytime* the user is interested in the data. Also
this does not take advantage of any sequential ifIndex ranges.
Both of the above options are not too efficient.
The idea here is to design a MIB that has the following properties.
1) Allows user to specify objects (columns) of interest.
The objects can belong to different tables, as long as they are
semantically related.
This is a one time operation.
2) Allows user to specify object instances of interest (rows)
Multiple row instances can be specified for maximum flexibility.
This is a one time operation.
3) Row instances can be single indexed or multi-indexed.
4) Has an access table which is more like a "view" that contains
exactly what the user has requested. The user can then issue
get-bulk requests on the access table to retrieve the data.
5) Supports a file transfer kind of a mechanism as defined in the
current draft-ietf-eos-snmp-bulkdata-00.txt. This gives the
flexibility of either using SNMP requests on the access table
or populating a file which can then be transferred off the device.
6) The access table has a mechanism to indicate sparse object
instances (holes). Holes would be plugged in with a dummy instance
and the same would be indicated using a bit map for each row.
This MIB according to me has the following advantages.
1) The access table will contain only those object instances that the
user interested in. This will encourage use of get-bulks and make
the use of a get-bulk PDU to retrieve discontiguous object instances
more efficient.
2) The access table provides a conceptual view based
on multiple MIB tables. Again the use of a get-bulk allows the user
to retrieve objects from multiple tables as if they belong to the
same table. For e.g the user is interested in retrieving objects
for ethernet interfaces from the IF-MIB and the ETHER-LIKE-MIB.
3) Since the user will typically use a get-bulk to retrieve entries
from the access table, MIB implementation optimizations can be
done to increase efficiency of data access for frequently polled
MIBS like IF-MIB etc.
(For e.g by pre-fetching a set of rows, knowing that the get-bulk
will require them)
4) It is possible to support sparse objects, by having a sparse object
indicator for every row in the access table. This object is a bit
map that indicates whether an object instance in the row is valid
or not. By plugging NULL object instances with a dummy, we can
avoid re-ordering and maintain row semantics.
5) When combined with the file transfer mechanism defined in
draft-ietf-eos-snmp-bulkdata-00.txt, the user has the flexibility
of using SNMP requests or file transfers to get the required data.
I am attaching a rough and a basic MIB draft. It also contains some
text recommending a way for NMS's to fetch data from the access table.
I have not included the file transfer mechanism as supported by
draft-ietf-eos-snmp-bulkdata-00.txt.
Hoping to receive responses.
Thanks,
Nalin
--
-- MIB description
--
--
-- This MIB module facilitates data retrieval of tabular objects.
-- This MIB can be used for performance/accounting purposes, where
-- several row instances of a set of objects are polled over a
-- period of time.
--
-- The MIB provides the user a way to specify which objects and which
-- instances are required. In addition the MIB provides 2 ways in
-- which this data can be retrieved.
--
-- Access tables.
-- --------------
-- The MIB provides access tables (dcmAccessRowTable &
-- dcmAccessObjectTable) which can be queried to retrieve the set
-- of required varbinds.
-- The access tables provide a 'view' of exactly what the user wants.
-- This makes it possible for the user to retrieve the contents of the
-- access table using existing bulk mechanisms like the get-bulk PDU.
--
-- The access tables support the notion of 'data rows'. The objects
-- specified in the dcmObjectsTable & dcmObjectInstanceTable, should
-- belong to the same conceptual table. The conceptual table can contain
-- attributes (columns) belonging to different MIB tables, but it should
-- be semantically possible to relate these columns in a tabular
-- relationship. Each data row has a corresponding sparse object indicator,
-- dcmAccessRowSparseInd. This object indicates which object instance of
-- the row is valid/invalid. This guarantees that each data row in the
-- access tables contains objects qualified by the same instance.
--
--
--
-- E.g dcmObjectsTable (objects of interest):
-- -----------------------------------------
-- dcmObjectsIndex dcmObjectsOid
-- --------------------------------
-- 1 ifInOctets
-- 2 ifOutOctets
-- 3 ifHCInOctets
-- 4 ifHCOutOctets
--
-- dcmObjectInstanceTable (objects of interest):
-- ----------------------------------------------
-- dcmObject dcmObject dcmObject dcmObject
-- InstanceIndex InstanceType InstanceOid InstanceOidEnd
-- (ifIndex) (ifIndex)
-- 1 individual 1
-- 2 individual 5
-- 3 range 10 12
-- 4 range 23 25
--
-- dcmAccessRowTable (objects of interest):
-- ----------------------------------------------
-- dcmAccessRowIndex dcmAccessRowSparseInd dcmAccessRowInstOid
-- 1 0 1
-- 2 0 5
-- 3 24 10
-- 4 24 11
-- 5 24 12
-- 6 0 23
-- 7 0 24
-- 8 0 25
--
-- dcmAccessObjectTable (objects of interest):
-- ----------------------------------------------
-- dcmAccess dcmAccess dcmAccess dcmAccess
-- ObjectIndex ObjectRowIndex ObjectCounter32Val ObjectCounter64Val
-- ------------------------------------------------------------------
-- ####### ifInOctets
-- 1 1 356
-- 1 2 400
-- cont..
-- 1 8 4566
-- ####### ifOutOctets
-- 2 1 2000
-- 2 2 3000
-- cont..
-- 2 8 4000
-- ####### ifHCInOctets
-- 3 1 356
-- 3 2 400
-- 3 3 (invalid)
-- 3 4 (invalid)
-- cont..
-- 3 8 4566
-- ####### ifHCOutOctets
-- 3 1 2000
-- 3 2 3000
-- 3 3 (invalid)
-- 3 4 (invalid)
-- cont..
-- 3 8 4000
--
--
-- To retrieve the objects 'row wise' the NMS can issue a get-bulk
-- as shown:
-- getbulk -v2c 0 8 dcmAccessRowSparseInd ### sparse indicator
-- dcmAccessRowInstanceOid ### ifIndex
-- dcmAccessObjectCounter32Val.1 \ ### ifInOctets
-- dcmAccessObjectCounter32Val.2 \ ### ifOutOctets
-- dcmAccessObjectCounter64Val.3 \ ### ifHCInOctets
-- dcmAccessObjectCounter64Val.4 ### ifHCOutOctets
--
-- After retrieving the required rows, the
-- NMS has to simply replace all occurences of
-- dcmAccessObjectCounter32Val.1 by ifInOctets,
-- dcmAccessObjectCounter32Val.2 by ifOutOctets,
-- dcmAccessObjectCounter64Val.3 by ifHCInOctets,
-- dcmAccessObjectCounter64Val.4 by ifHCOutOctets
-- and for all the objects,
-- replace dcmAccessObjectRowIndex by the value of dcmAccessRowInstanceOid.
--
-- File mode:
-- ----------
-- The MIB also provides a mechanism by which the object instances
-- specified in dcmObjectsTable & dcmObjectInstanceTable are retrieved
-- and populated in a file. This MIB also supports transfer of this
-- file to off the box locations.
-- This idea is similar to that described in
-- draft-ietf-eos-snmp-bulkdata-00.txt
--
-- The MIB shown below does not have objects to support file transfer
-- yet. These objects have already been defined in
-- draft-ietf-eos-snmp-bulkdata-00.txt, and the design can be reused
-- here.
--
DATA-COLLECTION-MIB DEFINITIONS ::= BEGIN
IMPORTS
MODULE-IDENTITY, OBJECT-TYPE,
Counter32, Integer32,
Unsigned32, Counter64,
IpAddress FROM SNMPv2-SMI
RowStatus FROM SNMPv2-TC
MODULE-COMPLIANCE,
OBJECT-GROUP FROM SNMPv2-CONF
SnmpAdminString FROM SNMP-FRAMEWORK-MIB
ciscoMgmt FROM CISCO-SMI;
dataCollMIB MODULE-IDENTITY
LAST-UPDATED "200111041420Z"
ORGANIZATION "Cisco Systems, Inc."
CONTACT-INFO "Cisco Systems
Customer Service
Postal: 170 W Tasman Drive
San Jose, CA 95134
USA
Tel: +1 800 553-NETS
E-mail:"
DESCRIPTION
"The MIB module for facilitating periodic collection of bulk
and performance/accounting data."
::= { ciscoMgmt 1099 }
dataCollMIBObjects OBJECT IDENTIFIER ::= { dataCollMIB 1 }
dcmConfig OBJECT IDENTIFIER ::= { dataCollMIBObjects 1 }
dcmAccess OBJECT IDENTIFIER ::= { dataCollMIBObjects 2 }
dcmStatus OBJECT IDENTIFIER ::= { dataCollMIBObjects 3 }
nullOID OBJECT IDENTIFIER ::= { 0 0 }
dcmConfigTable OBJECT-TYPE
SYNTAX SEQUENCE OF DcmConfigEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A table of data collection configuration entries. Each entry
represents a set of objects whose values need to fetched for
the specified instances."
::= { dcmConfig 1 }
dcmConfigEntry OBJECT-TYPE
SYNTAX DcmConfigEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An individual entry in the dcmConfigTable."
INDEX { dcmConfigIndex }
::= { dcmConfigTable 1 }
DcmConfigEntry ::= SEQUENCE {
dcmConfigIndex Unsigned32,
dcmConfigComment SnmpAdminString,
dcmConfigRowStatus RowStatus
}
dcmConfigIndex OBJECT-TYPE
SYNTAX Unsigned32 (1..4294967295)
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An arbitrary integer to uniquely identify this entry. To
create an entry a management application should pick a
random number."
::= { dcmConfigEntry 1 }
dcmConfigComment OBJECT-TYPE
SYNTAX SnmpAdminString
MAX-ACCESS read-create
STATUS current
DESCRIPTION
"A writable string, useful for administrative purposes."
::= { dcmConfigEntry 2 }
dcmConfigRowStatus OBJECT-TYPE
SYNTAX RowStatus
MAX-ACCESS read-create
STATUS current
DESCRIPTION
"Control row creation/deletion operations. This object also
controls row operations for dcmObjectsTable &
dcmObjectInstanceTable."
::= { dcmConfigEntry 3 }
dcmObjectsTable OBJECT-TYPE
SYNTAX SEQUENCE OF DcmObjectsEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A table to specify the objects whose values need to be
collected."
::= { dcmConfig 2 }
dcmObjectsEntry OBJECT-TYPE
SYNTAX DcmObjectsEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An individual entry in the dcmObjectsTable."
INDEX { dcmConfigIndex, dcmObjectsIndex }
::= { dcmObjectsTable 1 }
DcmObjectsEntry ::= SEQUENCE {
dcmObjectsIndex Unsigned32,
dcmObjectsOid OBJECT IDENTIFIER
}
dcmObjectsIndex OBJECT-TYPE
SYNTAX Unsigned32 (1..2039)
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An arbitrary small integer for the purpose of identifying
individual objects within a data collection group identified
by dcmConfigIndex. The range is so specified to
match the range of dcmAccessRowSparseInd."
::= { dcmObjectsEntry 1 }
dcmObjectsOid OBJECT-TYPE
SYNTAX OBJECT IDENTIFIER
MAX-ACCESS read-create
STATUS current
DESCRIPTION
"The OBJECT IDENTIFIER (OID) of the object represented by this
entry. The OID must be the complete OID of the object."
::= { dcmObjectsEntry 2 }
dcmObjectInstanceTable OBJECT-TYPE
SYNTAX SEQUENCE OF DcmObjectInstanceEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Table containing the row instance OIDs of objects whose
values need to be fetched. Row instance OIDs can be specified
as individual instances, range instances or subTree instances."
::= { dcmConfig 3 }
dcmObjectInstanceEntry OBJECT-TYPE
SYNTAX DcmObjectInstanceEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An individual entry in the dcmObjectInstanceTable."
INDEX { dcmConfigIndex, dcmObjectInstanceIndex }
::= { dcmObjectInstanceTable 1 }
DcmObjectInstanceEntry ::= SEQUENCE {
dcmObjectInstanceIndex Unsigned32,
dcmObjectInstanceType INTEGER,
dcmObjectInstanceOid OBJECT IDENTIFIER,
dcmObjectInstanceOidEnd OBJECT IDENTIFIER,
dcmObjectInstanceNumRepitions Unsigned32
}
dcmObjectInstanceIndex OBJECT-TYPE
SYNTAX Unsigned32 (1..4294967295)
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An arbitrary small integer for the purpose of identifying
individual row instances for a data collection group
identified by dcmConfigIndex."
::= { dcmObjectInstanceEntry 1 }
dcmObjectInstanceType OBJECT-TYPE
SYNTAX INTEGER { individual(1), range(2), subTree(3) }
MAX-ACCESS read-create
STATUS current
DESCRIPTION
"Specifies whether the instance represented by this entry is
an individual instance or a instance range or an instance
subTree."
DEFVAL { subTree }
::= { dcmObjectInstanceEntry 2 }
dcmObjectInstanceOid OBJECT-TYPE
SYNTAX OBJECT IDENTIFIER
MAX-ACCESS read-create
STATUS current
DESCRIPTION
"The instance OID identifying the row(s) to be fetched.
If dcmObjectInstanceType is 'individual' then this object
should contain the complete instance OID of the row.
If dcmObjectInstanceType is 'range' then this object
contains the start OID of the range. The value need not be
fully instantiated.
If dcmObjectInstanceType is 'subTree' then this object
contains a partially instantiated row instance. It can
contain a NULL OID which indicates that the entire subTree
(all instances of each object) should be fetched.
SMIv2 mandates the OBJECT IDENTIFIER types should
have atleast 2 sub-ids and the first sub-id has to be one of
0,1,2. To satisfy this requirement the first 2 sub-ids of
cdcObjectInstanceOid will always be 0.0."
DEFVAL { nullOID }
::= { dcmObjectInstanceEntry 3 }
dcmObjectInstanceOidEnd OBJECT-TYPE
SYNTAX OBJECT IDENTIFIER
MAX-ACCESS read-create
STATUS current
DESCRIPTION
"This object is used when dcmObjectInstanceType is set to
range. This object contains the end OID of a range of rows
that need to be fetched. This OID has to be lexicographically
higher than dcmObjectInstanceOid.
SMIv2 mandates the OBJECT IDENTIFIER types should
have atleast 2 sub-ids and the first sub-id has to be one of
0,1,2. To satisfy this requirement the first 2 sub-ids of
cdcObjectInstanceEndOid will always be 0.0."
DEFVAL { nullOID }
::= { dcmObjectInstanceEntry 4 }
dcmObjectInstanceNumRepitions OBJECT-TYPE
SYNTAX Unsigned32
MAX-ACCESS read-create
STATUS current
DESCRIPTION
"This object provides an alternative method of specifying a
range. It specifies the number of lexicographically next
instances to fetch, starting from dcmObjectInstanceOid."
DEFVAL { 0 }
::= { dcmObjectInstanceEntry 5 }
dcmAccessRowTable OBJECT-TYPE
SYNTAX SEQUENCE OF DcmAccessRowEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Table containing instances of objects as specified
in dcmObjectsTable & dcmObjectInstanceTable."
::= { dcmAccess 1 }
dcmAccessRowEntry OBJECT-TYPE
SYNTAX DcmAccessRowEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An entry describing a row instance."
INDEX { dcmConfigIndex, dcmAccessRowIndex }
::= { dcmAccessRowTable 1 }
DcmAccessRowEntry ::= SEQUENCE {
dcmAccessRowIndex Unsigned32,
dcmAccessRowSparseInd OCTET STRING,
dcmAccessRowInstOid OBJECT IDENTIFIER
}
dcmAccessRowIndex OBJECT-TYPE
SYNTAX Unsigned32 (1..4294967295)
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An index uniquely identifying an instance of a row for the
data collection group identified by dcmConfigIndex. This is
a running counter starting from 1, for each data collection
group."
::= { dcmAccessRowEntry 1 }
dcmAccessRowSparseInd OBJECT-TYPE
SYNTAX OCTET STRING (SIZE (1..255))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Indicates which objects of this row instance are valid and
which are invalid. The Octet String is treated as a bit
string, if a bit is set then the corresponding bit position
identifies the (object) dcmObjectsIndex which is sparse for
this row. Bit position '0' is not used, owing to the fact the
dcmObjectsIndex is never 0."
::= { dcmAccessRowEntry 2 }
dcmAccessRowInstOid OBJECT-TYPE
SYNTAX OBJECT IDENTIFIER
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The instance OID of a row. This is the OID representation of
the index of the object instances."
::= { dcmAccessRowEntry 3 }
dcmAccessObjectTable OBJECT-TYPE
SYNTAX SEQUENCE OF DcmAccessObjectEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A table containing object instances of a row. Applications can
retrieve values row-wise by using the index combination of
{ dcmConfigIndex, dcmObjectIndex, * }."
::= { dcmAccess 2 }
dcmAccessObjectEntry OBJECT-TYPE
SYNTAX DcmAccessObjectEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An entry containing a single object's value."
INDEX { dcmConfigIndex, dcmAccessObjectIndex, dcmAccessObjectRowIndex }
::= { dcmAccessObjectTable 1 }
DcmAccessObjectEntry ::= SEQUENCE {
dcmAccessObjectIndex Unsigned32,
dcmAccessObjectRowIndex Unsigned32,
dcmAccessObjectCounter32Val Counter32,
dcmAccessObjectUnsigned32Val Unsigned32,
dcmAccessObjectInteger32Val Integer32,
dcmAccessObjectIpAddressVal IpAddress,
dcmAccessObjectOctetStringVal OCTET STRING,
dcmAccessObjectOidVal OBJECT IDENTIFIER,
dcmAccessObjectCounter64Val Counter64
}
dcmAccessObjectIndex OBJECT-TYPE
SYNTAX Unsigned32 (1..4294967295)
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"The dcmObjectsIndex which is represented by one of
the value objects instances in this table."
::= { dcmAccessObjectEntry 1 }
dcmAccessObjectRowIndex OBJECT-TYPE
SYNTAX Unsigned32 (1..4294967295)
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"The dcmAccessRowIndex which is represented by one of
the value object instances in this table."
::= { dcmAccessObjectEntry 2 }
dcmAccessObjectCounter32Val OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The value of a Counter32 type object."
::= { dcmAccessObjectEntry 3 }
dcmAccessObjectUnsigned32Val OBJECT-TYPE
SYNTAX Unsigned32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The value of a Unsigned32 type object."
::= { dcmAccessObjectEntry 4 }
dcmAccessObjectInteger32Val OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The value of a Integer32 type object."
::= { dcmAccessObjectEntry 5 }
dcmAccessObjectIpAddressVal OBJECT-TYPE
SYNTAX IpAddress
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The value of a IpAddress type object."
::= { dcmAccessObjectEntry 6 }
dcmAccessObjectOctetStringVal OBJECT-TYPE
SYNTAX OCTET STRING (SIZE (0..65536))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The value of a OCTET STRING type object."
::= { dcmAccessObjectEntry 7 }
dcmAccessObjectOidVal OBJECT-TYPE
SYNTAX OBJECT IDENTIFIER
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The value of a OBJECT IDENTIFIER type object."
::= { dcmAccessObjectEntry 8 }
dcmAccessObjectCounter64Val OBJECT-TYPE
SYNTAX Counter64
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The value of a Counter64 type object."
::= { dcmAccessObjectEntry 9 }
--
-- Conformance
--
dataCollMIBConformance OBJECT IDENTIFIER ::= { dataCollMIB 3 }
dataCollMIBCompliances OBJECT IDENTIFIER ::= { dataCollMIBConformance 1 }
dataCollMIBGroups OBJECT IDENTIFIER ::= { dataCollMIBConformance 2 }
-- Compliance
dataCollMIBCompliance MODULE-COMPLIANCE
STATUS current
DESCRIPTION
"The compliance statement for entities which implement
the Data Collection MIB."
MODULE -- this module
MANDATORY-GROUPS {
dcmConfigGroup,
dcmAccessGroup
}
::= { dataCollMIBCompliances 1 }
-- Units of Conformance
dcmConfigGroup OBJECT-GROUP
OBJECTS {
dcmConfigComment,
dcmConfigRowStatus,
dcmObjectsOid,
dcmObjectInstanceType,
dcmObjectInstanceOid,
dcmObjectInstanceOidEnd,
dcmObjectInstanceNumRepitions
}
STATUS current
DESCRIPTION
"MIB configuration objects."
::= { dataCollMIBGroups 1 }
dcmAccessGroup OBJECT-GROUP
OBJECTS {
dcmAccessRowSparseInd,
dcmAccessRowInstOid,
dcmAccessObjectCounter32Val,
dcmAccessObjectUnsigned32Val,
dcmAccessObjectInteger32Val,
dcmAccessObjectIpAddressVal,
dcmAccessObjectOctetStringVal,
dcmAccessObjectOidVal,
dcmAccessObjectCounter64Val
}
STATUS current
DESCRIPTION
"Access related objects."
::= { dataCollMIBGroups 2 }
END