Utility Functions
Reference
agent_to_hostifEmptytoBooleantoNumbertoLongtrim_zerocheck_rangegetURLHostgetURLPortgetURLProtocolgetURLPathgetURLQuerygetURLUserInfoprintObjectsamplesvaluestimestampssendTcpMessagesendTcpMessageReplylockunlock
agent_to_host
agent_to_host(string a) string
Extracts hostname from the ITM agent name, typically consisting of optional instance, hostname, and ITM product code.
Examples:
/*
Primary:HOST_01:NT -> HOST_01
HOST_02:LZ -> HOST_02
*/
agent_to_host(entity)
ifEmpty
ifEmpty(object a, object b) object
Returns b if a is either null or an empty string.
Examples:
/* Returns 2 */
ifEmpty(null, 2)
/* Returns hello */
ifEmpty('hello', 'world')
toBoolean
toBoolean(string | number obj) bool
Converts a string or number obj to boolean value. The function returns true if obj is the string true, yes, on (case-insensitive), or equal to the number 1. Otherwise, the functions returns false. Refer to the value table below for additional examples:
| Input | Type | Result |
|---|---|---|
yes | string | true |
YES | string | true |
on | string | true |
1 | string | true |
1 | number | true |
no | string | false |
NO | string | false |
hello | string | false |
0 | string | false |
0 | number | false |
3 | number | false |
Examples:
// Returns false
toBoolean('hello')
toBoolean(0)
toBoolean('off')
// Returns true
toBoolean('YES')
toBoolean(1)
toBoolean('On')
toNumber
toNumber(object a [, number defaultValue]) double
Converts an input object, typically a string, to a decimal number.
If the input cannot be parsed into a number, the function returns Double.NaN or the default value, if specified.
Value table:
| Input | Type | Result |
|---|---|---|
null | - | NaN |
"" | string | NaN |
" " | string | NaN |
"hello" | string | NaN |
"null" | string | NaN |
"0" | string | 0.0 |
"1" | string | 1.0 |
"1.0" | string | 1.0 |
[] | array | NaN |
0 | number | 0.0 |
1 | number | 1.0 |
toLong
toLong(object a [, long defaultValue]) long
Converts an input object to a long integer number.
trim_zero
trim_zero(object a) string
Formats the input number to a decimal representation without an exponent field and by stripping trailing zeros from fractional numbers.
check_range
check_range(object in, number min, number max, number default) double
The function converts the input argument in to a number and checks if it satisfies the minimum and maximum constraints. The constraints are inclusive. If one of the constraints is violated, the function raises an error.
If in is not a valid number, the value default is returned.
Example:
check_range(in, 0, 100, 25)
Input in | Type | Result |
|---|---|---|
null | - | 25 |
"" | string | 25 |
NaN | number | 25 |
8 | number | 8 |
"8" | string | 8 |
0 | number | 0 |
50 | number | 50 |
100 | number | 100 |
-10 | number | Error |
200 | number | Error |
printObject
printObject(object obj, string format) string
Prints input object obj as a two-column table in the specified format.
Supported formats:
markdownasciipropertycsvhtml
The first column contains field names, the second column contains the corresponding field values.
Object o can be an Entity or Window object. Retrieve such objects using the applicable function:
Returns an empty string if ojb is null.
Examples:
printObject(getEntity('atsd'), 'ascii')
+--------------------------+------------------------------------+
| Name | Value |
+--------------------------+------------------------------------+
| created | 1516996501692 |
| enabled | true |
| id | 1 |
| interpolate | LINEAR |
| label | ATSD |
| name | atsd |
| portalConfigs | [] |
| portalConfigsEnabled | [] |
| tags | {container=axibase/atsd:latest} |
| timeZone | null |
...
printObject(rule_window('jvm_derived'), 'csv')
Name,Value
empty,false
lastText,null
status,OPEN
windowStatus,OPEN
...
printObject(rule_windows('jvm_derived', "tags != ''").get(1), 'markdown')
| **Name** | **Value** |
|:---|:--- |
| empty | false |
| lastText | Send 300 commands to ATSD. |
| status | REPEAT |
| windowStatus | REPEAT |
...
samples
samples([int limit]) map
Retrieves an ordered map of time series samples from the current window. Each sample object in the map contains two fields: key which stores command time as a DateTime object, and value which contains the numeric value.
The samples are sorted by command time in ascending order, with the oldest sample placed at the beginning of the map.
An optional limit argument can be specified to return a subset of samples:
- If
limitis positive, the function returns the firstNsamples. - If
limitis negative, the function returns the lastNsamples.
To retrieve sample times and values separately, use timestamps and values functions respectively.
Window samples:
key | value |
|---|---|
2018-09-18T13:43:36Z[Etc/UTC] | 10.0 |
2018-09-18T13:44:06Z[Etc/UTC] | 40.0 |
2018-09-18T13:44:36Z[Etc/UTC] | 50.0 |
2018-09-18T13:45:06Z[Etc/UTC] | 85.0 |
2018-09-18T13:45:32Z[Etc/UTC] | 90.0 |
Expression examples:
${addTable(samples(2), 'markdown')}
| **key** | **value** |
|:---|:--- |
| `2018-09-18T13:43:36Z[Etc/UTC]` | 10.0 |
| `2018-09-18T13:44:06Z[Etc/UTC]` | 40.0 |
${addTable(samples(-1), 'csv')}
key,value
2018-09-18T13:45:32Z[Etc/UTC],90
@foreach{item: samples(-2)}
- @{date_format(item.key, "yyyy-MM-dd HH:mm:ss")} = @{item.value}
@end{}
- 2018-09-18 13:45:06 = 85.0
- 2018-09-18 13:45:32 = 90.0
Refer to Control Flow overview for more information about the
@foreachtemplate.
values
values([int limit]) [number]
Retrieves a list of numeric sample values in the current window. The list is sorted by command time in the ascending order. Values are floating-point numbers (double).
An optional limit argument can be specified to return a subset of values:
- If
limitis positive, the function returns values in the firstNsamples. - If
limitis negative, the function returns values in the lastNsamples.
timestamps
timestamps([int limit]) [long]
Retrieves a list of sample command times in the current window. Each time is a DateTime object. The list is sorted by command time in the ascending order.
An optional limit argument can be specified to return a subset of times:
- If
limitis positive, the function returns sample times in the firstNsamples. - If
limitis negative, the function returns sample times in the lastNsamples.
getURLHost
getURLHost(string url) string
Retrieves host from the URL specified by the string url. If url is null, empty or invalid, an exception is thrown.
Example:
/* Returns "example.org" */
getURLHost('https://example.org/en/products?type=database&status=1')
getURLPort
getURLPort(string url) int
Retrieves port from the URL specified by the string url. If url is null, empty or invalid, an exception is thrown.
If url contains no port, the function returns the default value for the protocol, for example port 443 for HTTPS and port 80 for HTTP.
Example:
/* Returns 443 */
getURLPort('https://example.org/en/products?type=database&status=1')
getURLProtocol
getURLProtocol(string url) string
Retrieves protocol from the URL specified by the string url. If url is null, empty or invalid, an exception is thrown.
Example:
/* Returns "https" */
getURLProtocol('https://example.org/en/products?type=database&status=1')
getURLPath
getURLPath(string url) string
Retrieves path from the URL specified by the string url. If url is null, empty or invalid, an exception is thrown.
Example:
/* Returns "/en/products" */
getURLPath('https://example.org/en/products?type=database&status=1')
getURLQuery
getURLQuery(string url) string
Retrieves query string from the URL specified by the string url. If url is null, empty or invalid, an exception is thrown.
Example:
/* Returns "type=database&status=1" */
getURLQuery('https://example.org/en/products?type=database&status=1')
getURLUserInfo
getURLUserInfo(string url) string
Retrieves the user credential portion of the username:password key-value pair from the URL string specified by the string url. If url is null, empty or invalid, an exception is thrown.
Example:
/* Returns null */
getURLUserInfo('https://example.org/en/products?type=database&status=1')
/* Returns "john.doe:secret" */
getURLUserInfo('https://john.doe:secret@example.org/en/products?type=database&status=1')
sendTcpMessage
sendTcpMessage(string host, int port, string message) int
The function sends the specified message to a remote server, identified with the hostname and port, via the TCP protocol. The response status code is an integer:
| Status | Description |
|---|---|
0 | Connection established successfully. |
1 | Connection Error |
2 | No Route To Host |
3 | Unknown Host |
4 | Socket Timeout |
5 | Other Error |
${sendTcpMessage('example.org', 9001, "hello world")}
${sendTcpMessage('example.org', 9001, entity + ' alert')}
sendTcpMessageReply
sendTcpMessageReply(string host, int port, string message [, timeout]) TcpReply
The function sends the specified message to a remote server, identified with the hostname and port, via the TCP protocol. After the message is sent, the function awaits a response from the server, for up to 30 seconds. The default timeout can be customized using the optional timeout argument specified in seconds.
The function returns a TcpReply object containing the following fields:
status- Response status integer.response- Response text received from the remote server.execTime- Execution time in milliseconds.
| Status | Description |
|---|---|
0 | Connection established successfully. |
1 | Connection Error |
2 | No Route To Host |
3 | Unknown Host |
4 | Socket Timeout |
5 | Other Error |
${sendTcpMessageRepy('example.org', 9001, order + '
')}
TcpReply(status=4, response=Order 123 received OK, execTime=250)
sendUdpMessage
Same as sendTcpMessage function using UDP as the protocol.
sendUdpMessageReply
Same as sendTcpMessageReply function using UDP as the protocol.
lock
lock(string key, long interval_millis) boolean
Create a named lock on the server for the specified duration of time in milliseconds. If an action triggered by another rule attempts to acquire the same lock within the lock interval, the function returns false.
The function can be used to ensure that some action is executed only once.
Example:
/*
Send TCP message (cmd) to the target server
and ensure that the SAME command is not sent to the server
within 15 seconds.
*/
@if{lock(cmd, 15000)}
${sendTcpMessageReply('example.org', 9092, cmd)}
@end{}
The atsd.log records lock acquisition attempts with relevant rule details.
2019-07-03T08:10:21.742Z;INFO;sendNotificationsExecutor-2;com.axibase.tsd.service.el.ElFunctionsServiceImpl;Lock 'call-01' acquired by rule 'call_order', window {"metric":"property","entity":"nur","tags":{}}: locked until 2019-07-03T08:10:36.742Z
2019-07-03T08:10:21.806Z;INFO;sendNotificationsExecutor-18;com.axibase.tsd.service.el.ElFunctionsServiceImpl;Lock 'call-01' not acquired by rule 'call_order', window {"metric":"property","entity":"nur","tags":{}}: locked until 2019-07-03T08:10:36.742Z
To prevent the action from executing twice on the same day, enable Alert Logging and invoke the last_open() function:
@if{!lock(cmd, 15000) || date_format(last_open().open_time, 'yyyy-MM-dd') != date_format(now, 'yyyy-MM-dd')}
${cancelAction()}
@end{}
# execute action or send notification
unlock
unlock(string key) boolean
The function releases a previously acquired lock. The result is true if an active lock is found for the specified key and the lock is released.
@if{unlock(entity)}
Actions for `${entity}` were unlocked.
@end{}