1.17.2. Reporting#
Starting with LinOTP 2.9 a new reporting API was introduced. It can be used to query information about the number of tokens. This can be useful for accounting in multitenancy environments or statistical purpose.
The comprehensive API documentation can be found here:
https://www.linotp.org/doc/api/linotp.controllers.reporting.html
The basic API call is:
https://<LINOTP>/reporting/<ReportingController>?session=SESSIONCOOKIE[&PARAM1][&PARAM2][..]
The available controllers are:
show
displays historical count data
period
displays historical count data in a specific period (from to)
maximum
displays highest values counted
delete_all
clean the counter database
delete_before
delete all values in the counter database recorded before a defined date
Tip
Detailed information about the handling of the session cookie can be found at system_controller
Prerequisites#
The reporting API can be accessed by the token managers. The available queries have to be configured before via policies as described in Reporting Policies.
Tip
After adding new states to be recorded in the policies the next count will be performed after an event was triggered potentially changing the counted value. So for example if a new token is enrolled the counters are recalculated and can be queried.
Configuration#
The reporting feature must be activated so that LinOTP starts recording events. We will only be able to evaluate reporting for events that have been recorded after the reporting has been enabled.
Activating Reporting and Reporting access#
Reporting is enabled by configuring a policy in the reporting scope. Within the user interface manage UI in the scope reporting, with the action token_status=. The action can be used multiple times to configure different status types for reporting.
Policy complete example
[Reporting]
realm = *
name = Reporting
action = 'token_total, token_status=assigned&active, token_status=unassigned&active,
token_status=assigned&inactive, token_status=unassigned&inactive, token_status=active,
token_status=inactive, token_status=assigned, token_status=unassigned'
client = *
user = *
time = * * * * * *;
active = True
scope = reporting
Reporting_access is activated with the corresponding policy from the reporting_access scope.
[Reporting_access]
realm = *
name = Reporting_access
active = True
client = *
user = *
time = * * * * * *;
action = "show, period, maximum, delete_all, delete_before"
scope = reporting.access
Current limitations#
tokens not assigned to a realm are not reported in the APIs that group by realm.
To get exact numbers the call is necessary for each realm individually.
You can look at the LinOTP documentation for Poliy about token_total reporting.
Reporting Modes#
LinOTP can log reporting in two different modes:
- token_total reporting:
Basic reporting of total Number of Tokens only - reporting/[maximum|status|period]?
The entire available period is evaluated retroactively up to the last ‘reporting/delete_before’.
Total is determined without status and realms
- token_status reporting:
Advanced reporting for different token states - reporting/show or reporting/period
Explanation of the available token states:
active
counts only active tokens
inactive
counts only deactivated tokens
assigned
counts only tokens assigned to users
unassigned
counts only tokens which are not assigned to any user
active&assigned
counts tokens which are active and assigned to a user
active&unassigned
counts active tokens which are not assigned to any user
inactive&assigned
counts disabled tokens assigned to users
inactive&unassigned
counts disabled tokens which are not assigned to any user
total
counts all tokens that are assigned to a realm
*
only for delet_all or delete_before the star stands for each status
- reporting_period define a reporting period:
The status of the tokens can be queried as with reporting and show for a period ‘from=YYY-mm-dd&to=YYY-mm-dd’.
With ‘period’ and the desired status e.g. ‘status=active%26assigned’ an exact report about the used tokens in the specified period ‘from=2022-04-01&to=2022-05-01’ can be generated.
The feature of ‘token_total’ is fully supported in mode ‘token_status’, which is why we only cover the advanced reporting using the token_status reporting.
Note
Calling ‘reporting/show?’ without any further parameters will output all raw reporting data. Of course only with a valid session cookie!
Evaluation / Reporting APIs#
Reporting is based on an index that is created and updated with token management activities. To get an exact count of the status for a period of time it may be useful to rebuild the index. This can be done by deleting the index with ‘reporting/delete_all’ or ‘delete_before’. The next change of the status of a token leads to a rebuild of the index. This can take a long time with large token databases.
Report of the current number of tokens in the specified status or period
/reporting/show?
show number of tokens in the specified status and/or realm
/reporting/period?
show number of tokens in the specified status and/or realm in a period from to
- period is the time period from day to day in the format:
from=YYY-mm-dd&to=YYY-mm-dd in the calls with reporting/period in place reporting/show
http://<linotp_ip>/reporting/show?session=<session>&status=total&
sortby=timestamp&sortdir=desc&pagesize=1&page=1&realms=<realm>
http://<linotp_ip>/reporting/period?session=<session>&status=
active,assigned,active%26assigned,unassigned&from=2022-03-01&to=2022-04-01
session
Cookie of the valid admin session fetched in the same browser or in a script with ‘admin/getsession’.
status
active%26assigned,active,…
sortby
Optional, serves the readability of the output
pagesize=1&page=1
Optional
realms
“Realmname” Optional, allows the output of the specified realm.
from=...&to=...
the period of the report
Report on the maximum number of tokens
/reporting/maximum?
maximum number of tokens in the specified status
Again, tokens that are not assigned to a realm are not counted. These reports are currently not recommended for the license report.
http://<linotp_ip>/reporting/maximum?session=<session>&status=active,
assigned,active%26assigned,unassigned,active,inactive
Perform Queries#
show or period#
Displays the token counters recorded over time. The output can be filtered regarding the token states and the realms.
https://<LINOTP>/reporting/show?session=SESSIONCOOKIE[&PARAM1][&PARAM2][..]
Available parameters:
realms
[optional]Limit the counter output to the given realms.
status
[optional]Limit the counter output to tokens with of certain states.
Tip
Please make sure to use exactly the same token states for the queries as defined in the reporting policies (Reporting Policies)
Displays all available historical numbers of all tokens of all states
https://linotp.example.net/reporting/show?session=45e939b02[...]
{
"version": "LinOTP 2.9",
"jsonrpc": "2.0802",
"result": {
"status": true,
"value": {
"resultset": {
"page": 1,
"pages": 1,
"pagesize": 30,
"report_rows": 30
},
"data": [
{
"count": 132,
"realm": "realm1",
"description": "",
"timestamp": "2016-07-25 13:27:47",
"detail": "",
"value": "",
"session": "",
"parameter": "active",
"event": "token_tokenrealm"
},
{
"count": 150,
"realm": "realm1",
"description": "",
"timestamp": "2016-07-25 13:27:47",
"detail": "",
"value": "",
"session": "",
"parameter": "total",
"event": "token_tokenrealm"
},
[...]
Display token counts for certain realms
Show token count numbers for ‘realm1’ and ‘realm2’:
https://linotp.example.net/reporting/show?session=45e939b02[...]&realms=realm1,realm2
{
"version": "LinOTP 2.9",
"jsonrpc": "2.0802",
"result": {
"status": true,
"value": {
"resultset": {
"page": 1,
"pages": 1,
"pagesize": 30,
"report_rows": 30
},
"data": [
{
"count": 132,
"realm": "realm1",
"description": "",
"timestamp": "2016-07-25 13:27:47",
"detail": "",
"value": "",
"session": "",
"parameter": "active",
"event": "token_tokenrealm"
},
{
"count": 150,
"realm": "realm1",
"description": "",
"timestamp": "2016-07-25 13:27:47",
"detail": "",
"value": "",
"session": "",
"parameter": "total",
"event": "token_tokenrealm"
},
[...]
{
"count": 300,
"realm": "realm2",
"description": "",
"timestamp": "2016-07-25 13:27:54",
"detail": "",
"value": "",
"session": "",
"parameter": "active",
"event": "token_tokenrealm"
},
[...]
}
Display token count numbers for certain states
Show count numbers for unassigned active tokens:
https://linotp.example.net/reporting/show?session=45e939b02[...]&status=unassigned%26active
{
"version": "LinOTP 2.9",
"jsonrpc": "2.0802",
"result": {
"status": true,
"value": {
"resultset": {
"page": 1,
"pages": 1,
"pagesize": 6,
"report_rows": 6
},
"data": [
{
"count": 11,
"realm": "realm1",
"description": "",
"timestamp": "2016-07-26 11:37:58",
"detail": "",
"value": "",
"session": "",
"parameter": "unassigned&active",
"event": "token_enable"
},
{
"count": 12,
"realm": "realm1",
"description": "",
"timestamp": "2016-07-26 13:00:10",
"detail": "",
"value": "",
"session": "",
"parameter": "unassigned&active",
"event": "token_init"
},
[..]
}
Display token count numbers for certain states
Show count numbers for assigned active tokens in a period:
https://linotp.example.net/reporting/period?session=45e939b02[...]
&status=active,assigned,assigned%26activei&from=2022-04-01&to=2022-05-01
{
"version": "LinOTP 2.12.5",
"jsonrpc": "2.0802",
"result": {
"status": true,
"value": {
"period": {
"to": "2022-04-01T00:00:00",
"from": "2022-05-01T00:00:00"
},
"realms": [
{
"maxtokencount": {
"active": 6,
"assigned": 6,
"active&assigned": 6
},
"name": "users"
},
{
"maxtokencount": {
"active": null,
"assigned": null,
"active&assigned": null
},
"name": "admin"
},
...
{
"maxtokencount": {
"active": 1,
"assigned": 1,
"active&assigned": 1
},
"name": "realm2_user"
},
]
}
},
"id": 1
}
maximum#
Display the highest number counter for token of a certain state in realms.
https://<LINOTP>/reporting/maximum?session=SESSIONCOOKIE[&realms=REALMA,REALMB,...]
[&status=STATEA[%26STATEB][,STATEC[%26STATED]][,[..]]]
Available parameters:
status
[optional]
realms
[optional]
Show total number of tokens
https://<LINOTP>/reporting/maximum?session=SESSIONCOOKIE
Show highest numbers of total tokens counted for all realms:
https://linotp.example.net/reporting/maximum?session=45e939b02[...]
{
"version": "LinOTP 2.9",
"jsonrpc": "2.0802",
"result": {
"status": true,
"value": {
"realm1": {
"total": 270
},
"realm2": {
"total": 178
}
}
},
"id": 1
}
Show number of tokens of certain states from specific realms
https://linotp.example.net/reporting/maximum?session=45e939b02[...]
&status=inactive,unassigned&realms=realm1
{
"version": "LinOTP 2.9",
"jsonrpc": "2.0802",
"result": {
"status": true,
"value": {
"realm1": {
"unassigned": 15,
"inactive": 25
}
}
},
"id": 1
}
Delete counters from database with delete_all#
Available parameters:
status
[optional, Without status only token ‘total’ is deleted]
realms
[optional, Without realms all realms are processed.]
Delete all count data
https://linotp.example.net/reporting/delete_all?session=45e939b02...
&status=*
{
"version": "LinOTP 2.9rc2",
"jsonrpc": "2.0802",
"result": {
"status": true,
"value": 586
},
"id": 1
}
Delete token counter of selected realms
Delete all tokens counter from realm1:
https://linotp.example.net/reporting/delete_all?session=45e939b02[...]
&status=*&realms=realm1
{
"version": "LinOTP 2.9",
"jsonrpc": "2.0802",
"result": {
"status": true,
"value": 432
},
"id": 1
}
Delete token counter for selected states
Delete all tokens counter of the state inactive or disabled:
https://linotp.example.net/reporting/delete_all?session=45e939b02[...]&status=inactive,disable
{
"version": "LinOTP 2.9",
"jsonrpc": "2.0802",
"result": {
"status": true,
"value": 18
},
"id": 1
}
Delete counters from database with delete_before#
Delete entries from the database before a given date. The removal can be optionally selective regarding the realm and the token states.
https://<LINOTP>/reporting/delete_before?session=SESSIONCOOKIE&date=YYYY-MM-DD
[&realms=REALMA,REALMB,...][&status=STATEA[%26STATEB][,STATEC[%26STATED]][,[..]]]
Available parameters:
date
the date before counters are deleted in format YYYY-MM-DD
status
[optional, Without status only token ‘total’ is deleted]
realms
[optional, Without realms all realms are processed.]
Remove all count data recorded before 2016-07-22:
https://linotp.example.net/reporting/delete_before?session=45e939b02[...]&date=2016-07-22
{
"version": "LinOTP 2.9",
"jsonrpc": "2.0802",
"result": {
"status": true,
"value": 157
},
"id": 1
}
Remove count data for all active token from realm1 recorded before 2016-07-26:
https://linotp.example.net/reporting/delete_before?session=45e939b02[...]
&status=active&realms=realm1&date=2016-07-26
{
"version": "LinOTP 2.9",
"jsonrpc": "2.0802",
"result": {
"status": true,
"value": 68
},
"id": 1
}