The standard monitoring solution allow you to take advantage of not only the change detection and notification functionality inherent in Direct+ monitoring but also the ability to set Thresholds against certain data elements, filter our elements one may not be interested and take an initial seed and subsequent seed files of the DUNS Numbers you have registered. Additionally, you can registered either a List of DUNS Numbers (LOD) or a predefined universe. Not all of this functionality is available for UBO and Family Tree Monitoring and these difference are detailed in the documentation.
Please refer Create a Registration page for details.
Note: For China, due to recent regulatory changes limited data is available for online & monitoring.
Following are the parameters specific to Data Blocks/Data Products
The Threshold monitoring service has been developed to you to be alerted when specific, defined changes occur to the entities (DUNS) they have registered for monitoring. For example, notify me when the D&B Failure Percentile Score falls below 40.
Summary of Thresholds:As a Direct+ Monitoring customer you can register to be notified of changes that occur if certain conditions are met. These conditions can be if something goes above or below a given value (or even equals it). numeric, boolean or string elements can be used to determine when a condition is met. For example, you may register to receive a threshold notification when the value of a specific element has increased by 10%.. These notifications will be provided via the normal notification channels.
Data Types:Threshold monitoring will be possible on boolean, numeric and string data types only.
Thresholds can only be applied to List of Duns (LOD) registrations. They cannot be applied to Universe registrations. A new type of registration, THRESHOLD, has been defined that allows you to define rules to indicate when you want to be informed of any changes to the data used in your rules. You can define one or more rules, declaring data (defined using JSON paths) in the monitored product, by providing an expression that will be evaluated to determine if a notification should be delivered based on the state of the data. If a notification delivery is triggered, then data related to the rules that triggered will be delivered as part of the notification. Data that changed but was not declared as a JSON path in at least one rule is discarded and not sent as a part of the notification. Declared JSON paths are treated as an implicit jsonPathInclusion.
[ {
"id": "myNameRule",
"jsonPaths": [
{
"path": "organization.primaryName",
"alias": "primaryName"
}
],
"condition": "(primaryName != primaryNamePrev) && (lower(primaryName)!=lower(primaryNamePrev))"
}
]
All rules submitted must follow the following JSON schema. You can use a JSON schema validation tool to determine if a proposed rule is valid while designing their rules. An online schema validator can be found at the following location (please note we use draft-04 of Json schema as per this link : https://jsonschemalint.com/#!/version/draft-04/markup/json)
{
"$schema": "http://json-schema.org/draft-04/schema#",
"definitions": {
"thresholds":{
"type": "object",
"required": ["id", "jsonPaths", "condition"],
"properties": {
"id": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9]{0,15}$"
},
"jsonPaths": {
"type": "array",
"items": {
"$ref": "#/definitions/jsonPath"
}
},
"condition": {
"type": "string"
}
},
"additionalProperties": false
},
"jsonPath":{
"type": "object",
"required": ["path", "alias"],
"properties": {
"path": {
"type": "string",
"pattern": "^(?!.*\\.$)[A-Za-z][A-Za-z0-9\\.]*"
},
"alias": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9]{0,15}$"
}
},
"additionalProperties": false
}
},
"type": "array",
"items": {
"$ref": "#/definitions/thresholds"
},
"additionalProperties": false
}
The following is an example of three Threshold rules submitted on a registration.
[
{
"id": "myScoreRule",
"jsonPaths": [
{
"path": "organization.corporateLinkage.globalUltimateFamilyTreeMembersCount",
"alias": "famTreeMemCount"
},
{
"path": "organization.numberOfEmployees",
"alias": "numOfEmployees"
}
],
"condition": "(famTreeMemCount > 30000 && numOfEmployees < 7) || (famTreeMemCount > 5000 && numOfEmployees < 700)"
},
{
"id": "aDefaultRule",
"jsonPaths": [
{
"path": "organization.primaryAddress.premisesArea.measurement",
"alias": "premisesArea"
}
],
"condition": "(premisesArea > 500 && premisesAreaPrev != 400)"
},
{
"id": "RuleWithDesc",
"jsonPaths": [
{
"path": "organization.corporateLinkage.globalUltimateFamilyTreeMembersCount",
"alias": "famTreeMemCount"
}
],
"condition": "(famTreeMemCount > 5 && famTreeMemCountPrev != 4)",
"description": "This is an example of an optional rule description which may be up to 256 characters in length."
}
]
Here a user defines a condition that shall generate a notification delivery if the condition evaluates to true.
All common arithmetic operators are supported. Boolean operators are also fully supported. Relational and logical operators (>, <, >=, <=, ==, !=, !) are evaluated as Boolean types (either Boolean.TRUE or Boolean.FALSE). The following table shows the operators in order of precedence. A check mark indicates that the operator can be used with the specific type of variable.
Double | String | ||
---|---|---|---|
Power | ^ | ✓ | |
Boolean Not | ! | ✓ | |
Unary Plus, Unary Minus | +x, -x | ✓ | |
Dot product, cross product | ., ^^ | ||
Modulus | % | ✓ | |
Division | / | ✓ | |
Multiplication | * | ✓ | |
Addition, Subtraction | +, - | ✓ | ✓(only +) |
Less or Equal, More or Equal | <=, >= | ✓ | ✓ |
Less Than, Greater Than | <, > | ✓ | ✓ |
Not Equal, Equal | !=, == | ✓ | ✓ |
Boolean And | && | ✓ | |
Boolean Or | || | ✓ | |
Assignment | = | ✓ | ✓ |
The following additional functions are provided for use within a condition
Function | Description | Example |
---|---|---|
Contains(stringValue, searchString) | Returns true if stringValue contains searchString | Contains(name, 'IBM') |
PercentChange(newVal, origVal) | Returns the percent change to two decimal places | PercentChange(109, 100) == 9 |
IfNull(val, valueToUse) | Returns valueToUse if val is null | IfNull(null, 10) |
ValueInRange(val, lowerValue, upperValue, inclusive) | Returns true if val is between lowerValue and upperValue | ValueInRange(25, 10, 25, true) == true |
Function | Description | Example |
---|---|---|
Left | left(str, len) | Get substring starting at the start of the string and len characters long. |
Right | right(str, len) | Get substring starting at the end of the string and going back len characters long. |
Middle | mid(str, start, len) | Get substring starting at the position specified and len characters long. |
Sub string | substr(str, start, [end]) | Get substring starting at the position specified and ending at the position specified |
Lower Case | lower(str) | The string in lower case |
Upper Case | upper(str) | The string in upper case |
Length | len(str) | The length of the string |
Trim | trim(str) | Trim whitespace from a string |
The following is an example of the structure of a threshold ALERT notification. The displayed element paths are for illustration purposes only and may not actually be valid threshold paths:
{
"type": "ALERT",
"timestamp": "2019-06-19T06:00:04Z",
"organization": {
"duns": "390612679"
},
"thresholds": [
"myScoreRule",
"RuleWithDesc"
],
"elements": [
{
"element": "organization.corporateLinkage.globalUltimateFamilyTreeMembersCount",
"current": 9074,
"prev": 500,
"timestamp": "2018-12-18T06:00:04Z",
"thresholds": [
{
"id": "myScoreRule",
"baseline": 403,
"timestamp": "2018-12-18T06:00:04Z"
},
{
"id": "RuleWithDesc",
"baseline": 103,
"timestamp": "2014-01-18T06:00:04Z"
}
]
},
{
"element": "organization.numberOfEmployees",
"current": 200,
"prev": 3000,
"timestamp": "2018-12-18T06:00:04Z",
"thresholds": [
{
"id": "myScoreRule",
"baseline": 3000,
"timestamp": "2018-13-18T06:00:04Z"
}
]
}
]
}