| Sensorboard framework manual | V2.14 - September 2025 W.P. Maasdam |
||
| |||
| What is a sensor ? |
| A use case |
| Sensor states: warnings and errors |
| Show the sensorboard |
| Recieve an email on calamities |
| Running the board |
| Feature overview |
| Group settings |
| Sensor settings |
| Subscribers |
| Schedules for groups |
| Upload and download |
| The framework |
| Steps: add a sensor |
| Parameters and sensor text settings |
| The zone |
| Internationalization |
| oData sensor services |
| Advanced topics |
You've found the manual for the Sensorboard - home of sensors that keep an eye on details of your S/4 Hana system. The manual consists of 3 main subjects:
The board comes with a suite of operational sensors, which are explained in Sensorboard - sensors manual.
The first signs came from the sensorboard.
Which does exactly what is was designed to do.
Only minutes after it happened.
Je hebt de handleiding gevonden bij een Nederlands- en Engelstalig sensor bord, thuishaven voor sensoren die een oogje in het zeil voor je houden voor het S/4 Hana systeem. De handleiding is alleen in het Engels beschikbaar en dekt in hoofdlijnen de volgende onderdelen:
Het sensor bord is uitgerust met een set operationele sensoren die zijn beschreven in de volgende handleiding Sensorboard - sensors manual.
The Sensorboard is a product that was designed and developed in Abap on S/4 Hana. The actual board is shown
in a SAPGUI screen as HTML (CSS, JavaScript) document. The board refreshes automatically to continuously show the
latest available detail. The detail is presented as a KPI (Key Performance Indicator) number each of which which
is explained in the sensor detail report.
Preview of the sensorboard with errors and warnings
An alternative view, where the sensors are compacted.
Preview of the same sensorboard - compacted
Compacted with a background image
The examples show some of the different settings the end user can select for themselves. All examples show the same sensorboard.
The product comes with a series of over 50 technical sensor types that can be customized to perform many possible sensor tasks. The framework also caters for custom sensors - which can easily be added to the board. These will most likely be sensors for functional checks. How to add a custom build sensor to the board is explained on this manual.
De gehele applicatie is beschikbaar in het Nederlands (en tegelijkertijd in het Engels).
The complete application is available in English (and simultaneously in Dutch).
Documentation is only available in English.
This is the manual for the sensorboard and framework.
There's also a manual describing the sensors.
Everything is running smoothly and there are no known concerns. But on a the system as large and versatile as ours, we should be careful assuming everything is fine. How can we ensure operations are running smooth ? How can we create an overview of potential issues ?
If every room in the building has a smoke-sensor, we can assume nothing is on fire in the building. The basement could still be flooded though. Installing smoke sensors as digital sensors that monitor the state of the system - is not a new thing. In network maintenance quite a suite of commercial products is available for this. And to extend the reach of these products into a live SAP system, sensors from this board can be added.
A sensor is mini-report that determines a KPI number. When opened it provides an explanation on what the KPI means and how it was determined - with enough detail to follow it up. A number with an explanation. Every time the mini-report is executed - the KPI is re-determined and the new result is reported. "How many dumps were thrown in the past hour". "How many approvals open tasks older than 2 days". "How many errored Idocs in the past week".
When sensor details are viewed, a popup-report is shown that explains how the KPI was calculated. In a detailed overview the sensor reveals how to follow up with what information. In most cases this is done in a result table with columns and data that are specific to the sensor.
Sensor logic can be set up to test any assumptions, whether technical or functional. This is where the real added value of a sensorboard shows: functional assumptions can be captured in a sensor.
Sensor result: "24 issues" - with summary "24 salesorders that are not for 'Belgium'".
Sensor result: "4 duplicates" - with summary: "Email duplicates: 4 duplicates".
As sensors are checked regularly through the framework, the sensorboard continuously reports an up-to-date compact overview of the state of affairs. On top of that, sensors can "call out" to users via email - the moment something has gone wrong, involving users the moment something falls over.
So the main theme for a (any) sensor is the KPI. In most cases the KPI indicates something is wrong. A higher KPI number indicates a greater severity of the problem.
Just behind reception in your office building, there is a panel with the map of all the floors in the building. Each room shows at least one small diode(light) which is never on. These diodes are linked to smoke sensors which are in the rooms. When a fire breaks out, an alarm will sound for the whole building and the room in which the smoke was detected will have it's diode light up in the map. When the fire fighters arrive, they will know exactly where to go. Valuable and life-saving minutes are spared. As a fire would progress, more and more rooms will "light up" on the map behind reception, a clear indication on how serious the issue is.
Using this setup for a system, allows overall system health to be monitored. A digital panel with sensors that continuously perform checks is a continuous health insurance. Not just for storage space or a number range that is nearing it's upper limit, not just to ensure no mission critical jobs failed recently. Also for to check functional assumptions on the data that is being processed. Should a certain bit of information be set up on new projects ? Just set up a sensor on the number of projects that don't have this bit of information.
Sensors can be reported as a little red (or green or blue) icon. Or as a small stamp-sized summary with essential information.
Sensors are updated regularly and continuously, so the information on the sensor is up-to-date. The sensorboard itself is also regularly refreshed (every 20 seconds) so the board itself is also up-to-date. Let the board do the actual checking for you.
System health monitoring tool as active sensorboard. Sensors with KPI for just about anything.
S/4 Hana systems.
From version 750.
Check the board for up-to-date KPI's and get a notification when something goes wrong.
The sensorboard is up and running and the obvious sensors are on there somewhere. The obvious sensors being the dump-counter or the number of batch jobs that failed recently. If something derails, the board will inform the subscribers for the "system health" sensors.
That's not the use-case we would like to emphasize here.
There is a job that checks and corrects sales orders. The job is called Z_SALESORDER_HEALTH runs every 30 minutes. The process is called "Sales order health" and a group with the same name is added to the board. The following sensors are added to the group - using sensor types that are already available (standard):
Z_SALESORDER_HEALTH job, a sensor is added
(sensor SM37SINGLE available in the standard setup) to test some of the job specifications. In our example
we want to make sure the job actually runs at least once every 2 hours, so the MAX_OFFLINE parameter (maximum
number of seconds between runs) is checked.SM37LOGS).
On the sensor settings, the number and id of the message is specified to make the sensor count the number of times
the message is logged. SM37). SLG1) that will report on the logs with errors, specific to this process. The
object and subobject for this will be specified on the sensor parameters. SQL) of a sensor that can be utilized without Abap coding. Count the number of sales orders
for the day. A sensor is designed to monitor the system. Sensor KPI's should give the insight, even without warning or error level. So the sensor on order errors may show 30 orders, if the sensor next to that shows 10.000 orders for that day - the overall priority is clear.
Sensors are instances of sensor types and the sensor type is where code logic lives. There are over 50 sensor
types available covering all kinds of general topics, like batch jobs or application logs. But also Idocs, work
queues (SMQ1, SMQ2, SM58, workflow event queue) and other topics. With the available sensors, a group dedicated
to a custom process can be set up - no coding required.
The sensorboard is also set up as a framework to which sensors can be added. With minimal coding effort, new
sensor requirements can be captured and made available on the board. This manual describes the steps to be
performed for this.
The board is live and the sensors are keeping a close eye on the batch job and the Application Logs. The following examples and responses indicate what can be done with live monitoring.
Sensor design caters for updates every few minutes. This does not mean it makes sense to update a sensor
with that frequency. The delay (in seconds) can be used to slow processing down.
This should provide insights on when measurement peaks happened before.
Sensors that are not operational because of the schedule, will show a Zzz-icon to indicate they are "sleeping/pauzed".
Schedules are available as a group feature. They describe when sensor checks are to be
carried out for the (all) sensors
of a group. The group execution calendar - is available in the Sensor settings application.
SQLINDX). Today the count-based and value-based sensors sit on the board next to each other. These usage examples could give you an impression of the control over sensors and the insights sensors provide. With over
50 operational sensors "out of the box" - there are many more examples to describe. Note as well that there are 2 open SQL sensors
as well (SQL and SQLINDX) - which feed on the selection of your preference - without invovling any abap coding.
Monitoring can be done in a broad spectrum. Ranging from relevant to the whole system down to a dedicated process like month end or order processing.
If you can count it, you can monitor it.
The main component in organizing sensors is the group. Have as many as you like/need and place the same sensor in several groups. The group is defined for a use case.
A sensor can only be available once in a group. Is your sensor also available in other groups ? The system will execute the sensor only once and apply the results to all groups.
Every sensor is displayed in a given state. The KPI indicator determines the state of the sensor. When memory usage exceeds 80%, the sensor should warn us (yellow), when it exceeds 95% the sensor should show the error state (red) and even mail us about it. But the sensor KPI does not always throw warnings or errors. Key figures can also be added just to keep in check with the overall process.
![]() |
The sensor is listed on the board, but is it not active. It will execute when clicked on - presenting the KPI results from the moment. But the scheduled updates will ignore the sensor. |
![]() |
The sensor is reporting accurate KPI details, but it has no warning limit or error limit. This sensor will thus never turn green, yellow or red. It shows accurate KPI results anyway. |
![]() |
Here's a sensor (these are all the same sensor, except for the last one) which has a warning limit or error limit (or both) set up. It shows as green because the KPI of 33% is less than the warning limit (and error limit). Green Sensors can turn yellow and/or red. |
![]() |
Things are getting a little more serious now. The KPI is 73% which is above the warning limit (70%). No need to panic, but maybe keep a closer watch on the board. |
![]() |
The sensor KPI (97%) has exceeded the error limit that was specified on the sensor. The sensor requires attention and an email will be composed and sent out to all subscribers of the group in which the sensor sits. Note that the email is composed only when the sensor is set to the error level. |
![]() |
Some sensors deliver their KPI as an analytical deviation percentage, much like the AEX-index. The percentage shown can be both positive and negative. When the warning limit and/or error limit is set on this type of sensor, it will work like regular sensors. |
The displayed information is the time of the most recent measurement (14:18) and the duration in which the sensor has been in it's current state (1w5d for 1 week and 5 days).
So it is the KPI that determines the state (and colour) of the sensor. Each sensor has their own KPI limit for the warning state and/or error state. Warning limit and error limit are not mandatory, so some sensors will never show as red/error (these are shown in white).
All animals are equal but some animals are more equal than others. Setting the priority of a sensor, is not really an option. As sensors can live in several groups, the priority is not a sensor topic. Groups can be assigned a priority, ranging from No priority / P3 - Low priority / P2 - medium priority to P1 - top priority. Thus priority is determined per group and applies to all sensors on the group.
The group priority is shown as e.g. P1 just left of the group title (check the overview examples).
To show the sensorboard use transaction ZEN.
The word zen means medidation. To practice zen has many aspects: to calm down, to (re)determine your motives, to be mindfull in daily life, to reflect on yourself. It is all connected.
A fitting name for a cockpit application on the health of the system.
The selection screen of ZEN hosts selection and display options. Try them out and find out what works for you. Once you're settled, just save the settings as a variant with your user ID as variant name. The next time you start ZEN, this variant will be used.
As the sensorboard is a single board that is available to the whole organisation, it will have groups that are of no interest to you. Just select the groups you want to see (or exclude groups you don't want to see) via the selection screen - and save your variant - to personalize your own board.
Once the board is shown, a dashboard like overview of sensors is displayed. Click on a sensor to get an up-to-date explanation of the KPI that was shown. Up-to-date: as a click on the sensor will immediately execute the sensor. Note that sensor logic could be slow to reproduce - thus some of these "sensor clicks" may be slow. The system will store any new results, so other sensorboard users will be presented the latest KPI results.
The board also hosts 3 other forms of viewing sensor data. Being:
For users that have access to sensor settings, CTRL+click will open the settings editor for the selected sensor. Press enter to focus on the settings and take things from there. Note that the sensorboard uses 2 authorisation levels. Authorisation for transaction code ZEN for the sensorboard and ZEN_EDITOR for the sensor settings application.
This will also execute the sensor and present the data that is presented on the sensor itself as an ALV report. This functionality will not be available or make sense on all possible sensors, but it can also be a good way to follow up on issues.
This will execute the selected sensor and store its results as historic sensor data. Historic sensor data can be reported in "Report historical data" where previously logged sensor data can be compared.
The sensorboard can also be used through oData services, backed by a RAP application. These services provide an overview of the board as well as the immediate execution of a single sensor, revealing all it's details (effectively everything that is on the sensor detail report).
Through this channel, the complete board can be made available as Fiori app or web app.
The moment a sensor turns red, a calamity is assumed. Sensors that show faults should be followed up. This can be done on one of 2 ways: solve the issue or adjust the error level on the sensor (Mozes and the mountain).
The moment a calamity occurs is an important moment. An email will be composed and sent out to all group subscribers. The email will show the sensor summary along with detailed information on the sensor. Users can subscribe to a group by clicking on "Not subscribed".
An email will be composed and sent to the email address that was set up for the user (transaction SU01d). The mail contains a summary of the sensor with details on how the KPI was determined. The mail content should hold enough information to determine what happened and what can be done to solve it.
Every sensor will have it's own way to report what happened. The following information will be available on all sensor reports:
The information on notifications can be considered very business-relevant and sending out an email on business-relevant information should be regarded as a "handle with care" situation. The sensorboard user strict rules on these settings, making sure there is a healthy transpacency on who receives email notifications.
The email address of that is used to send a notification to is the email address that is specified on the user master data. The first available email address will be used. This means a privately used email address can not be supplied, unless the user has the authority to change their own user settings (which is poor practice - from authorisation viewpoint).
(*) Do note the next paragraph.
There is an option to involve the shared inbox. Shared inboxes are viewed/monitored by
multiple people and may not have an SAP user counterpart. To cater for shared inboxes,
user id ZEN_USER_01 (fictional) can be set up through sensor type SUBSCRIBE.
Once set up, the fictional user can be subscribed to a group (or groups) and notifications
will be sent out when needed.
This can of course also be used to send out notifications to a private email account, which is regarded a hack (using functionality for which it was not designed). Note the next paragraph on transparency - if you will.
It should not be a secret where email notifications are sent out to. Standard SAP's
outbox (SOST) is available to check who is receiving mails. But this info
is also available from the sensorboard itself. Click on the title of the group to get
an overview of group details, with email receivers. This will reveal who is interested
in the group - which can also be regarded as an effective way to find group owners.
In addition to that there is the SUBSCRIBE sensor type. A sensor that
will show all receivers (for all groups) in a single overview. Starting with the special
cases - for shared inboxes. For more details on how to set this up, please check the
manual for sensor type SUBSCRIBE.
The setup of the sensorboard with groups of sensors enables organizing the board. An overview of means to organize and work with your sensors:
It is good to realize that the same sensor can be used in multiple groups. The sensor results are determined
once and applied everywhere.
All these options will show selected sensors in their respective groups. Even the Super compact option (which shows a
sensor as a tiny colored square) works as an operational board. Click on a sensor to execute it and reveal it's details.
Hover over the sensor to reveal it's title.
SUBSCRIBE for more on this).
This feature can be used for periodic KPI overviews, e.g. analytical sensors (the AEX-like index sensors that show growth in percentage) as mail overview.
SUBSCRIBE.
The sensorboard is not just about errors and issues. Some KPI's are used as performance indicators without ever being faulty (white sensors). To receive an email about these sensors:
ZSENSORS_ENGINE is scheduled at set intervals (e.g. daily) - with option "Inform subscribers for groups (email)". For some sensors the behaviour of the sensor can be relevant. As sensor KPI values are often a reflection of "how bad" things are going, a view on it's historic values can be valuable. When logging is switched on, the system will monitor the KPI values and report them as a bar-chart going back up to 90 days.
With the comparison report logged sensor results from 2 measurement moments can be shown side-by-side for comparison.
Find the comparison report on the sensorboard selection screen or the sensor settings editor.
With the power to do upload and download also comes the power to whipe out all settings. Hence backup functionality is available for the groups and sensors (and sensor settings) of the board.
To keep things from duplicating: each backup is checked against the previous backup, to determine whether storing the new backup is really necessary.
Changes on a sensor (apart from sensor text setting changes) are logged in a BAL (Business APplication Log) logging. Which is available from the sensor settings editor. Hence changing settings is not an anonimous matter.
Thus a sensor that consumes a full hour will cause the sensor engine to run at least that hour. The engine run that follows after only a few minutes will detect that the slow sensor is still being processed and skip it. Effect: slow sensors don't impact the overall board.
Schedules can be customized to describe a week with working times. And in addition calendar days (dates or date ranges) can be added to define a hyper-care period or christmas.
To follow up on the sensor, or resolve the issue the sensor brought to your attention, every sensor will have their own steps. The sensor tile only shows the KPI, the sensor report (click on the tile, or check your email) should explain the sensor. A brief description which refers to e.g. the transaction code to check explains what the sensor measured. Most sensors also show more detailed information, often as a table, which should clarify what objects were involved in the KPI determination.
Sensors which list specific details as a table can also disclose the information in an ALV report. This can be effected from the Sensorboard by clicking ALT+click on the required sensor. Alternatively find the sensor in Sensor Settings and select the Data preview button.
To help resolve the sensor issue a reference to documentation can be set up on the sensor. Such document can describe the known issues in more detail - if needed.
Once the issue is resolved, the sensorboard can be used to check the solution. As the sensor should become green (or yellow) again. Start ZEN, find the sensor and click on it. The check will be performed again and results should help you determine whether the applied solution was sufficient.
The sensorboard also helps determine the effectiveness of the solution.
Instantly.
The power of a good sensor is that it explains what happened in great detail. Detail that can sometimes be linked to a person or data that should not become generally available to all sensorboard users. A small feature is available on the sensorboad that will hide the detailed content of a (any) sensor.
Sensors can be sensored.
A censored sensor works like any other sensor, with KPI determination and response to warning and error levels. The only thing it will not do is show the sensor detailed report, as this will state "Sorry! The detailed content for this sensor is censored.
To censor a sensor (e.g. SUIM, just add this to the sensor longtext of the SENSOR sensor type:
/: CENSORED /* SUIM /* SUIMHISTORY /* SUIMSLEEPERSThe detailed content of the
SENSOR shows which sensor types have been censored.
In under 10 minutes, an email on a potential issue is sent out.
The root cause analysis gets a real healthy start with the sensor report.
Most mishaps show as a series of issues. The board reveals them.
The sensorboard comes alive with the sensor engine, a report that needs to be scheduled in the background. The engine is the heartbeat of the sensorboard. Scheduling needs to be set up with a maximum of 5 minutes interval between jobs. 3 or 4 minutes are preferred.
In extreme cases, a single sensor could consume a lot of performance. The architecture of the sensorboard caters for this: each sensor run is locked. So even if a single sensor would consume a full hour, new next sensor engine run would do it's job and skip the slow sensor (because it would still be locked).
Without the sensor engine job, the sensorboard would be fully operational. The only thing is that sensor KPI results would not be updated and emails would not be composed. The sensorboard has a self-service sensor, which checks the state of affairs with the sensor engine job. It will present itself in the selection screen of the sensorboard - when errors occur. The details on the sensor result should explain what's missing.
The sensor engine captures all relevant tasks in a single report. Note that not all tasks should be performed every few minutes, so it is quite normal to schedule report ZSENSORS_ENGINE several times with different variants and different periodicity. The main tasks:
Check out what this is about, sensor results from the past can be compared to the current sensor results. Or 2
logged sensors can be compared (both from the past).
Feeders are stand-alone reports that are not part of the sensorboard framework, but it uses sensor data
to perform their respective tasks. The feeder (naming convention ZSENSOR_FDR_* where the * is usually
the sensor type) will target a controlling
sensor and create a series of generated sensors for it. The controlling sensor would e.g. report results for all companies
and the generated sensors will do the same with a sensor for each company. For the top 10 available companies. This job would
typically be run once or twice a day. Sensors that were created by a feeder-job will have the "BAPI" indicator set.
The idea here is that sensors can be made available based on data, rather than a lot of manual actions. The feeder.
Fixers are also stand-alone reports that target the issue that is reported on the sensor. When issues can be
repaired automatically, a fixer job (naming convention ZSENSOR_FXR_* where the * is usually
the sensor type) can be scheduled to run as often as needed and this job can involve the sensor details or just the
sensor settings (e.g. test-settings) to perform it's task. Clean up aged loggings. Apply a targetted fix like creating
a relation or deleting one. The effect will reflect the sensor KPI in the runs to follow.
The idea here is that sensors from the board are aimed at locating issues and reporting about them. But where an automated fix is possible this should be set up - separate from the board.
There are 2 sensortypes that are about the sensorboard itself. The Self-service sensor (SENSOR) and the Subscription
sensor (SUBSCRIBE). Ideally both sesnsors are available on the board through this is not a hard-requirement. This paragraph
reveals what settings they can carry - applicable to the whole sensorboard.
There are a few settings that are applied on the sensorboard, which are customizable for the whole framework. These are:
SENSOR).
The subscribers of the groups are listed on each individual group (just click on the group name from the sensorboard). However The
SUBSCRIBE sensor is also available - which will reveal all subscribers for the whole board. As subscribers can only be
actual system users, the email addresses of these users determine where notification emails go.
With an exception: shared inboxes. To cater for shared inbox receivers (an inbox for a department or external party) - sensor settings are applied. As these settings are user by the sensorboard for the sensorboard - it is mentioned here. General sensorboard settings: external users for shared inboxes.
More on this on the manual for SUBSCRIBE.
A batchjob needs to run at least every 5 minutes - to re-determine the sensor KPI's.
The sensorboard heartbeat.
When the sensor engine job is unavailable, a sensor will alert on this from the selection screen and on the board itself.
The SUBSCRIBE sensor hosts information about subscribers, including the shared inbox subscribers.
The complete overview of all subscribers.
Sending emails to subscribers can be controlled with the sensor engine job.
From the selection screen of transaction ZEN button "Settings" is available. Users that are authorized to edit sensor data can use "Sensor settings" functionality.
The stamp-like tile that displays the KPI of a sensor.
A folder with sensors.
Sensors live in a group of related sensors. Whenever notification emails are sent, these are for the (all) sensors of a group. In case a user is interested in a single sensor only, just create a group with only that sensor.
The first 2 fields can be used to focus on a group - which will then be shown below. The "Details of focused group" will show details that can be changed. This setup is called a "line editor" and is used for the other tabs as well. First focus, then edit.
Available fields:
Folder with sensors that belong together.
The main subject of the sensorboard. Packed with customizable settings.
The logic behind a sensor.
The person with keen interest on what happens in a sensor group.
The settings report opens focused on this tab - as it is likely to be the most commonly used one.
![]() |
The sensor tab hosts a suite of functionality. Sensors can be looked up, created, changed, (de)activated, tested and copied to e.g. another group. Just make sure you save your changes. The main functionality:
|
Activate and de-activate a sensor New sensors are inactive (Off) by default. Sensors can be activated or deactivated any time. When an end user clicks on an inactive sensor - it is still executed and it will still determine its KPI. This caters for testing before activating. Inactive sensors are fully operational sensors, which are not automatically updated by the sensor heartbeat batchjob (the engine).
Sensor texts (optional) Sensor setting scan be available in the sensor (long)text or SO10 text. The "Text" icon will take you to this text. Do note: this is a sensor-type text, not really a sensor text. Thus it is possible to find the exact same text settings on different sensors (which will have the same sensor type). The button next to the text button will show documentation on that is expected - with an example text.
Sensor title (optional). The title of the sensor should be unique within the group. This is not mandatory but it is confusing to assign different sensors the same name. Is your sensor specific for a company code - mention the company code. When the title is left blank, the framework will provide the title (which is language dependant).
Unit of measure (optional). The unit of measure fort he KPI is described here. What is this number ? When the KPI Unit is left blank, the framework will provide one (which is language dependant).
Parameter value (optional). The parameter value is an additional instruction for the sensor. Sensors can be made specific for e.g. a company code. Or to control for how many days the sensor should select data. Use the F4 function on the parameter value field to find out which parameters are available for the sensor.
Board tile sequence (optional). Not a very nice task (tedious actually), but this field can be used to determine in which sequence the sensors are shown on the group.
Documentation (url) (optional). Documentation on the sensor is part of the sensor, however a reference to documentation can also be set on the sensor itself. This document could sit on Sharepoint and it could describe what the sensor is for or it could be used as a documented log of followup actions. The sensorboard will feature this link. And when sensor information is mailed out to subscribers, the documentation link will also be featured.
Delay (in minutes) (optional). Some sensors may run slow, which is not a problem for the framework. Every sensor check is locked, thus a follow-up run will simply ignore sensor that are still being processed. Nevertheless it may be a good idea to limit the check-sequence on performance consuming sensors - to save system resources. A delay of e.g. 120 would ensure the sensor is executed(no sooner than) every 2 hours.
Limits (optional). A sensor without limits will always be green/normal. It will still provide an up-to-date state of affairs and it can still be used to periodically update subscribers via an email. Sensors turn warning/yellow when reaching the warning limit and error/red when reaching the error limit, which will trigger an email to subscribers.
Icon 1. The sensor can be tested with the button on the far left (green hour-glass). A popup with the sensor tile details will be composed - just like the version from the sensorboard. The overview that is produced here does not have a maximum number of reported results (all will be shown, where the sensorboard will only show the first 50 entries).
Icon 2. The table-like icon can be used on any sensor (active or inactive) to report on the data that was logged on the sensor. This only works with sensors that report data in a table-format (which most sensors do).
Icon 3. The arrow into table icon can be used on any sensor (active or inactive) to compose a portable HTML document for the whole sensor. Portable HTML documents are singlular documents (.html) which contain formatting, information and images. They can be stored or emailed much like a PDF document. Share your findings or "keep a copy" somewhere.
Icon 4 and 5. These icons can be used to create a detailed log entry on the database. A detailed sensor log entry captures all the details that are listed on the sensor detail overview. The 4th Icon reports on what was logged. The report is set up to compare 2 measurement points or sensor-setail-snapshots.
Icon 6. The H-icon, which is only available when sensor logging is switched on. Logging The KPI results can be captured in a logging table. This will capture only KPI level changes (no further details). This icon will start a report (ALV) with the logged results.
Logging results are shown on sensor details in graphical representation like so:
Logging can be switched on and of any time. Do note that old logs are lost when switching logging off. The batch report for sensors also has an option to clear old data from the logs (under Housekeeping).
Normally the end user can arrange whether he/she is interested in the group, with a single click on the board. Alternatively the settings application also has a tab for Subscribers (in which users can be subscribed or subscriptions can be removed).
Subscriber details, which can also be used to list subscriptions (F8).
Groups can also be assigned a priority, which influences the need for subscribers. A group with P1 or P2 Priority should also have at least a subscriber. The self-service sensor will report a problem on this.
Priority is always a serious matter. And the priority on a sensorboard can be a life-changer. The concept of letting something go wrong is a reality matter. Finding out about it quick is where the board will show it's value.
Another reality when it comes to priority is getting the right people involved. Thus one could argue that a group which is set up as P1 - high priority, which has no subscribers will still go unnoticed. P1, P2 and P3 priority is nothing more than a label. It does not send emails out faster or do automatic followup on processes. The real priority followup is done by subscribers and they may want to know early on whether the issue is from a P1 group.
Sensors are updated regularly, to keep sensor information up-to-date. When a working day is over, the sensors will keep checking and an email on something that has gone wrong in the middle of the night will be sent out to the end user. What's important during office hours, does not need to be as important outside of office hours. Solution: use a schedule.
A schedule is an execution calendar in which the days of the week (every week) can be described. In addition the schedule can work with actual dates, to e.g. specify Christmas or a holiday period. Specify the schedule on a sensor group to put it in action.
Schedule details are captured in a text, then applied to (all the sensors in) a group. The framework will recognize which schedules are available to select for the group.
Select an existing schedule or supply a new schedule name to create one. Fill in the text as follows (example):
* TITLE:Office hours * TIME:I,BT,070000,120000 * TIME:I,BT,130000,170000 * DAY:MONDAY * TIME:E,BT,090000,120000 * DAY:TUESDAY * DAY:WEDNESDAY * DAY:THURSDAY * DAY:FRIDAY * DATE:E,EQ,20241225
Parameters explained:
The sensorboard is active 24 hours a day, every day. Use the schedule to limit it's operations to working hours.
The multinational is on-air 24 hours a day.
Create a group per 8-hour shift and put the sensors that need constant
monitoring in there (3 sets of the same sensors).
Then apply 3 schedules and get 3 groups of subscribers to subscribe.
Sensors are easy to create, change and remove again. They form a customizable link between the sensorboard and factual data with sensor type logic in the middle. Once you're happy with the sensorboard details, they can be moved to another system using upload/download functionality. Sensor settings are explicitly not transportable - as this is about transactional data that needs to be adjusted on the system it is used on.
The complete board can be downloaded to a single /JSON file. This can thus also be used as a safety backup for the board. Upload and download are great features, but there is also a risk: someone could un-intentionally whipe-out all settings. Best have a backup available.
The JSON download file holds all kinds and types of sensor data. Not just the sensors, also groups and sensor text settings. This makes a JSON download file a very compact and complete backup. But where should a backup file be stored ? And when should backup files be created ?
The framework can answer this one:
ZSENSORBACKUPS. The sensor editor has 2 ways to
do this: (1) from a group (for a group) and (2) for the full system, on the "More..." tab.
ZSENSORBACKUPS table can be retrieved by first storing it as JSON
file.
A backup for a specific group ? A specific sensor (in a group) ? First set the focus on the group or sensor, then set the download option. There is a thin line between user-friendly and MVP, Minimal Viable Product. This setup is MVP, but gets the job done.
As the note on the screen suggests, the JSON (JavaScript Object Notation) download file can be edited in e.g. Notepad. JSON has a similar setup/function as XML without the <tags>. When the downloaded file is opened in Notepad, it will look readable but compacted. As we are dealing with JSON (which is a popular way to capture data in a file format), we can use on-line JSON validators. Search for "JSON validator" and select one, like JSON Checker - The JSON Validator and Formatter.
Copy the JSON content from the Notepad editor into a validator tool:
The same download JSON in a JSON validator (after validation).
Other than the simple fact that this is much more readable, the use of a JSON validator has another huge advantage. When you do your changes in the validator, these will also be validated (the correct syntax of JSON will be checked). The upload functionality only accepts correctly formatted JSON files.
Sensors can also have settings in a sensor text. These settings are also part of the sensor download, so when
moving sensors around, the sensor settings text is also moved. There is no upload/download functionality for
Subscription information. A schedule can be uploaded/downloaded with report RSTXSCRP, which is available via a
button on the Settings application.
With upload/download in place, board settings can be moved to other systems. And of course the other way around. When changes are done on the settings of the production system - these can be propagated back to the test environment.
It is always a good idea to have a backup ready somewhere. With upload/download this is easy to do.
Just make sure it's done
Backups of the sensorboard can also be planned. Results will be stored in JSON format, only when settings factually changed.
Just make sure it's done
If the download results are handed to a JSON validator, the outcome is reasonably readable and even editable.
This is not very easy, but easy enough for those who dare. The risk of errors is limited, as the maximum damage is strange sensor settings which can be dismissed.
It can take quite some time setting up sensors with suitable warning and error levels. Try the predefined sensorboard groups which can easily be uploaded. These are available:
The sensorboard is set up as a framework. New sensors can be added from an existing class as part of an existing application, or as a dedicated class that has sensors as only function. The logic for a sensor is captured in a single method which requires a given naming convention (SENSOR_...) for the framework to find it. In addition the class which houses the sensor should implement interface ZIF_SENSORS. Method INTERNATIONALIZE (from the interface) should take care of sensor name and parameter descriptions. Once a new sensor is prepared, a tile can be created using the sensor settings functionality. Full step plan below.
A sensor determines a KPI value - and explains how it was determined. Value 0 means "all is well" and anything else means "something has gone wrong". Sensors can also show they couldn't do their job by returning -1 as KPI value.
So how would a sensor on daily sales work ? If the KPI would show the number of salesorders it would be accurate and valuable information - but it would not represent "a level of trouble". Consider this:
Take away: the KPI's main function is to determine the state of the sensor. It does not need to be a meaningful number (though often it can be). The Unit of Measure should help understanding what the KPI is.
Composed of classes, reports and tables.
Lives in a single method and hosts settings in a more general method.
Set up a sensor for your own coded solution on your own class.
The sensorboard setup consists of a suite of components in a framework. There is a report for the sensorboard, a report for settings (and editing) and a report for the background execution of sensors (and emailing and housekeeping). Then there are several classes that capture all related functionality for the reports. All of these components can remain unchanged - when the framework is implemented.
The framework is documented using AbapDoc. Every method has was documented and Eclipse will be friendly enough to reveal this (in context).
Eclipse editor revealing method-documentation (ABAPdoc)
If there is an umbrella system available, such as PRTG or Datadog, that could consume the information from the sensors -
a product-specific service could be set up to call the sensors from this framework. Thus KPI results can be disclosed to
sensorboards that monitor multiple systems. A sensor can be invoked with a single call to
ZCL_SENSOR_MANAGER=>EXECUTE_SENSOR(..). There is a RAP service for the board as well, ready to deliver the
sensorboard and sensor details as oData.
The board uses HTML to cater for it's sensorboard looks. Sensor tiles are packed with details and even more detail is revealed when hovering over the fields on the tile. In addition the HTML content is also used to compose a detailed sensor report as popup or as email.
The images that are shown are SVG images. SVG or Scalable Vector Graphics is a technique with which the image is composed of drawing-instructions, embedded in HTML coding. This is not visible in Emails (yet). As the SVG technique is also used to compose graphics for sensor history, the mails are set up with an attachment. Opening the attachment will show the report including it's SVG content (as the attachment is opened with a browser).
Sensors can keep track of their KPI values in a log. This will be shown on the sensor detail popup (email) as SVG image, or on the sensor settings application in ALV form.
The framework hosts exchange of sensors - between different systems. Thus a sensor that was set up for SalesOrder
monitoring in company A, can be set up in a dedicated class. The (abap) coding for this class can then be implemented
in company B without further actions. Sensor, descriptions, translations everything a sensor requires will be available
on the coding of the class. At this point class ZCL_SENSORS_STANDARD (32 sensors) and
ZCL_SENSORS_HOUSEKEEPING (10 sensors)
hold the bulk of the available sensors. But there is also a "self-service" and a "Remote board" sensor available on
ZCL_SENSOR_MANAGER which will
check the state of affairs on the sensorboard itself (like: is the background job for the sensorboard itself scheduled ?).
In addition, when the sensor framework is operational on multiple systems on your landscape, an RFC connection will
bring the number of error sensors from the other system(s) right to your board as sensor KPI.
There are a lot of "black box" classes on the framework, which will not require adjustments for your
custom sensors. More
that 50% of the overall coding is on individual (standard) sensors and to add a custom sensor all that will need to be done is add
a class with the sensor (or sensors).
No customizing. No threaded coding. Loads of examples.
You are encouraged to add sensor(s) to your own solutions - add your tiles on the board.
Version 2025-08 of the sensorboard framework consists of just under 20.000 lines of Abap coding. It has 12 classes for which 4 classes are dedicated to actual sensors - captured in just under 8.000 lines of Abap coding. There are 3 main reports covering the board itself, the sensor settings editor and the heartbeat job (engine). Another 5 reports cover smaller tasks.
All in all it took over 4 years from setting up the first sensor logic to date.
Before adding a sensor to the framework, make sure you look at what is already available. Try to find a sensor with logic that resembles what you want to do. Sensor logic lives in a single method and starting off with a working copy is definitely the way to go. The class and method of the sensor logic is mentioned on the sensor detail (html) report.
Where should you add your sensor ?. Best avoid the sensor classes that came with the product, like ZCL_SENSORS_STANDARD
and ZCL_SENSORS_HOUSEKEEPING. These should be left unchanged to support upgrades. The options:
For this step-plan, we are adding a sensor that determines the number of outbound Idocs with a given status.
ZEN and use F4 on the sensor type field to check. For this step plan, sensor
type MYIDOCS is used.
ZCL_SENSORS_PLAYGROUND ($TMP).ZIF_SENSORS to recognise the classes that can potentially hold sensor methods.
PUBLIC SECTION. INTERFACES zif_sensors .
ZIF_SENSORS~INTERNATIONALIZE will have appeared on your class, when the interface was added. This method
needs to be implemented. Internationalize means "make available in different languages" - and we will do so in English only.
Add the following method implementation to the class.
METHOD zif_sensors~internationalize.
ro_i18n = zcl_i18n=>get_instance( ).
ro_i18n->feed( VALUE #(
( id = 'SENSOR:MYIDOCS:TITLE' en = |My Idocs (outbound)| )
( id = 'SENSOR:MYIDOCS:UOM' en = |idoc| )
( id = 'SENSOR:MYIDOCS:SUMMARY' en = |Playground sensor| ) )
).
ENDMETHOD.
Note that the zcl_i18n=>get_instance method can also take a parameter value for the pool. When supplied, the
texts can be "overwritten" and more translations can be added using report ZI18N_EDITOR.
More information on this is described in paragraph "Internationalization".
MYIDOCS and it now has a name, uom for the KPI and a summary. The framework will use this on
the planning board and for F4 functions.
The next step is to create a public method for
the MYIDOCS sensor. Name it SENSOR_MYIDOCS and add the following parameters:
CLASS-METHODS sensor_myidocs IMPORTING iv_parvalue TYPE zsensors-parvalue OPTIONAL CHANGING co_log TYPE REF TO zcl_sensor_manager_log RETURNING VALUE(rv_resultcounter) TYPE int4.
This parameter set is the only proper way to link your sensor to the framework. Make sure the method name starts with
SENSOR_ followed by the sensor type name.
The parameters explained:
IV_PARVALUE or Parameter value holds the options that can be supplied on the sensor. An uppercased value that
can hold control information, like DATING:3 or TIMING:120;EXTRA_DETAILS:Y;MESTYP:MATMAS.
CO_LOG is the changing parameter for the sensor log. This will hold the details on the sensor detail report with an
introduction, messages and a paragraph with a table (header, lines and footer).
RV_RESULTCOUNTER for the KPI number of the sensor.
METHOD sensor_myidocs. rv_resultcounter = -1. ENDMETHOD.
At this point, your sensor will be available. It can be added to a group and displayed on the sensorboard. Start
transaction ZEN and go to Settings (or use transaction ZENEDIT). Click F4 on the Sensor type field:
The new sensor is available and can be added to a group (F4 on Sensor type)
Put the sensor on a board, run the board and click on it:
The new sensor as shown on the sensorboard (transaction ZEN).
The sensor is in place, but it has no sensor logic.
Every sensor is set up with a brief explanation on what it does. We will supply this here, using attribute CO_LOG - logging.
METHOD sensor_myidocs. co_log->add_info( ' Transaction WE05 can be used to find the ' ). co_log->add_info( 'faulty Idocs reported here.' ). co_log->add_info( 'Note the direction = 1 (outbound). ' ). rv_resultcounter = -1. ENDMETHOD.
The sensor now shows a sensor description.
Note that the sensor description can also be supplied in different languages. Check out the sensors in
ZCL_SENSORS_STANDARD for examples. Also: as all texts of the framework and all texts on
individual sensors are made available through the Internationalization mini-framework, they can be
adjusted and even translated to other languages (see Internationalization).
EDIDC (control records for Idocs). We'll use method
ADD_MESSAGE to reveal information on this selection.
co_log->add_message( 'Selection on all outbound Idocs with status <> 03' ). SELECT COUNT( * ) FROM edidc INTO @rv_resultcounter WHERE direct = '1' AND status <> '03'.
Example now shows KPI count and logging/explanation
Make sure you remove the rv_resultcounter = -1. line, as the KPI counter is now determined in the selection above.
Clear and precise explanations are important. When a user subscribes to your sensor, these are the texts that are emailed. It should explain what is happening and what can be done about it.
DATING parameter is the most common way to do this. First
add the parameter to the internationalization method - to inform the framework a parameter is used.
METHOD zif_sensors~internationalize.
ro_i18n = zcl_i18n=>get_instance( ).
ro_i18n->feed( VALUE #(
( id = 'SENSOR:MYIDOCS:TITLE' en = |My Idocs (outbound)| )
( id = 'SENSOR:MYIDOCS:UOM' en = |idoc| )
( id = 'SENSOR:MYIDOCS:SUMMARY' en = |Playground sensor| )
( id = 'SENSOR:MYIDOCS:P:DATING'
en = |DATING:10, select data for the last 10 days, including today| ) )
).
ENDMETHOD.
The DATING and TIMING parameters are standard. Other parameter names can be introduced where
required. To pick up the parameter values, apply logic like so:
co_log->add_message( 'Selection on all outbound Idocs with status <> 03' ).
data(lr_dating) = zcl_sensor_manager=>get_dating( iv_parvalue = iv_parvalue ).
if lr_dating-low is initial.
lr_dating-low = sy-datum.
lr_dating-high = sy-datum.
endif.
co_log->add_message( |Selection from { lr_dating-low date = user } to | &&
|{ lr_dating-high date = user } | ).
If no dating settings are available, the default of today is assumed.
It is a good custom to report the settings on the sensor. When the sensor output is sent out as a notification, it is good to include information about the selection.
Now all that is needed is to apply the dating information into the selection.
SELECT COUNT( * ) FROM edidc INTO @rv_resultcounter
WHERE direct = '1' AND status <> '03' and
credat between @lr_dating-low and @lr_dating-high.
The KPI for the sensor will now select it's data based on parameter settings. This also means that the end user
can place several sensors next to each other: one for today (DATING:0),
one for yesterday (DATING:1-1) and another one for the week before (DATING:7-2).
Need to show details as a table ? Use co_log methods:
add_subtitke to add a paragraph to the sensor logging
add_tableheader to compose a header line with column texts (;-separated)
add_tableline to compose a data-line (equally ;-separated)
add_tablefooter to finish the table Apply the following changes (replacing the select block):
"Selections - determine KPI
SELECT * FROM edidc INTO TABLE @data(lt_result)
WHERE direct = '1' and status <> '03' and
credat between @lr_dating-low and @lr_dating-high.
"Reporting on the selections.
co_log->add_subtitle( 'Overview of Idocs' ).
co_log->add_tableheader( 'Messagetype;Creation;Documentnumber' ).
loop at lt_result into data(ls_result).
co_log->add_tableline( |{ ls_result-mestyp };~{ ls_result-credat date = user };| &&
|{ ls_result-docnum }| ).
endloop.
co_log->add_tablefooter( ).
rv_resultcounter = lines( lt_result ).
A few things happened here. The selection was adjusted to select actual data instead of a counter. The resulting
table data is added to the sensor output with a subtitle, table header, table lines and a footer. And the KPI
of the sensor type is set to the number of selected results.
For this step, some changes are done to the sensor logic first. Instead of listing individual Idocs, we are reporting in Idoc counters per message type. The new output will be Messagtype + Description + the number of Idocs.
SELECT EDIDC~mestyp, EDIMSGT~DESCRP, count( * ) as counter
FROM EDIDC
LEFT OUTER JOIN EDIMSGT on EDIMSGT~MESTYP = EDIDC~MESTYP and EDIMSGT~LANGUA = 'E'
INTO TABLE @data(lt_result)
WHERE EDIDC~direct = '1' and
EDIDC~status <> '03' and
EDIDC~credat between @lr_dating-low and @lr_dating-high
GROUP BY EDIDC~mestyp, EDIMSGT~DESCRP.
"Reporting on the selections.
co_log->add_subtitle( 'Overview of message types' ).
co_log->add_tableheader( 'Messagetype;Description;Idocs' ).
loop at lt_result into data(ls_result).
co_log->add_tableline( |{ ls_result-mestyp };{ ls_result-descrp };| &&
|{ ls_result-counter NUMBER = USER }| ).
rv_resultcounter = rv_resultcounter + ls_result-counter.
endloop.
co_log->add_tablefooter( ).
Try this out, see how it looks. We are going to add text settings per message type, to assign a contact person to the report.
"The other" way to let the framework hold information for a sensor is the sensor long text. An SO10 text
can be composed in any way you like and will be available. Long texts can be as long as you need and is linked to
the sensor type. Sensor long text settings are applicable to the sensor type so if the sensor is implemented several
times, the implementations all have the same sensor long text settings.
To create settings, the sensor editor will present 2 buttons. One for editing and another one for a documentation popup on
how it should be edited. The framework extracts the information from the sensor coding. This is done by checking whether
the sensor logic calls method zcl_sensor_manager=>get_longtext( ). The settings editor detects a call and
will show the buttons on text settings for the respective sensor.
The information that is used to compose the help-page is composed from Abap comment lines, also directly from the
sensor logic. The key here is the comment notation: *| Comments
types: begin of lty_settings,
mestyp type edidc-mestyp,
contact type string,
end of lty_settings.
data lt_settings type sorted table of lty_settings with unique key mestyp.
...
LOOP AT zcl_sensor_manager=>get_longtext( ) INTO DATA(lv_textline).
*| The sensor text can be used to specify the message types for
*| which a contact person is known.
*| /: MATMAS
*| * Peter Potter
*| The contact person will be listed with the message type.
IF lv_textline-tdformat = '/:'.
INSERT VALUE #( mestyp = lv_textline-tdline ) INTO TABLE lt_settings
ASSIGNING FIELD-SYMBOL(<ls_settings>).
ELSE.
<ls_settings>-contact = lv_textline-tdline.
ENDIF.
ENDLOOP.
The call to get_longtext( ) will trigger the text buttons on the settings editor. And when the sensor is executed,
it will read the sensor longtext (in English only). The *| Comments will be used for the button on explaining
the text options. In this case, a table of message types with a contact name is composed. Note the use of /: in the
longtext, as it is not mandatory to do it this way - but commonly used in the standard sensors. The coding logic composes a table
LT_SETTINGS with the settings on the long text. These settings are then used/applied:
"Reporting on the selections.
co_log->add_subtitle( 'Overview of message types' ).
co_log->add_tableheader( 'Messagetype;Description;Idocs' ).
loop at lt_result into data(ls_result).
co_log->add_tableline( |{ ls_result-mestyp };{ ls_result-description };| &&
|{ ls_result-counter NUMBER = USER }| ).
if line_exists( lt_settings[ mestyp = ls_result-mestyp ] ).
co_log->add_tableline( |Contact: { lt_settings[ mestyp = ls_result-mestyp ]-contact }| ).
endif.
rv_resultcounter = rv_resultcounter + ls_result-counter.
endloop.
co_log->add_tablefooter( ).
The sensor results will now show additional information per message type - when it is available. Go to the sensor settings
for this sensor type and add your name to a message type.
DATING parameter is available for dates, as is the TIMING for times. Use the
ZCL_SENSOR_MANAGER=>GET_TIMING method for this.
DETAILED:Y or HIDE_WARNINGS:N. Use method ZCL_SENSOR_MANAGER=>GET_PARAMETER method for this.
CO_LOG. Note that there are more ADD_*
methods available than demonstrated on this tutorial. The ADD_TABLENODATA for example, which will test the table
with results and add a "No data found" message to the overview. Check out the options and don't forget the standards sensor types
can be used as usage examples.
ZCL_SENSOR_MANAGER=>gv_groupname_on_execution
will be available if a group reference is needed.
From a simple sensor that determines a KPI, to a sensor that
uses the DATING parameter to select more accurately. On to a sensor that lists results as a table, which is also available
as an ALV report - for end users. On to using the more elaborate sensor long text settings. Which can contain just about anything.
Sensors work with parameters and also host settings as text. Nearly all sensors use this setup and can be "parameterized". The most commonly used parameter settings control date and time:
TIMING:120
means a start time of 2 hours ago and an end time of "now" or "the moment the sensor check logic is called. The sensor
logic will use this for its selection logic. So no information older than 2 hours is selected/involved. TIMING:70-10
will start 70 minutes ago and end 10 minutes ago. Use method zcl_sensor_manager=>get_timing for this. DATING:8-1 means everything for the
past 7 days. zcl_sensor_manager=>get_dating. Using parameters can make the sensor specific for a company code or Idoc type. Sensors can be used for a specific group or purpose or subject, pinpointing problems. The sensor for batch job monitoring can now monitor that specific job that is relevant for a given group.
When using parameters, it is important to log what parameters were used and which value they had. This should be part
of the sensor details. In addition to that, the used parameters should be documented on method
zif_sensors~internationalize.
The Settings report will use this for F4 functionality on the sensor - which gives the user of the settings report the chance
to see what parameters are supported (and what they do).
Example of 2 parameter definitions TIMING and OPTION.
Click F4 on the Parameter value field to reveal available options.
For sensors that require more setting information that can be captured in parameters, the sensor settings text can be used. This is a standard SO10 long text that is made available in sensor logic itself and it can contain anything the sensor requires. Use zcl_sensor_manager=>get_longtext to fetch this text. Like with parameter settings, it is good practice to document the settings on the sensor itself. As example a sensor settings text on AL11 folders is shown, where for a folder (or any unique code) settings are available.
Example of a sensor settings text - for the FILES sensor.
This information is grouped per ID, a freely assignable (but uppercased) code. For the example these codes are also
used in AL11. Furthermore in this example there are several parameter settings for each ID, FOLDER, MAXTOTALSIZE and
MAXFILESIZE can be set up to supply the sensor with details on determining a KPI. On this example, the KPI is the
number of issues found.
The sensor should be set up to show the settings from the setting text, for the above example this shows as:
Example output for the FILES sensor - settings are shown as table.
The sensor settings text can be edited in the Settings application (report). Note that the report has a button for the "Example settings text" which is linked to a special coding block on the sensor logic. Consider the example below:
Coding snippet from the FILES sensor.
Which will show as:
Popup from the Settings application - button "Example settings text".
One additional remark on the use of parameters and the sensor settings text. Alternate parameters is the way to
differentiate sensors in sensor logic. This means a parameter for a company code will make the sensor logic do
something specific company code selection. The settings text is one and the same text for all sensors of the same
type. Combine parameters with settings text content if you need to work with multiple parameters. The system has
several examples where this is done, like the above FILES sensor.
Consider using the SKIP parameter when the same sensor type is used multiple times. There are
several examples available for this (like the above FILES example). The idea behind SKIP is as follows: the sensor
longtext is in fact a sensor-type longtext, which is applicable to all sensors of the same type. Using SKIP is
the way to inform the sensor that the settings should be ignored for sensors without parameters. Why ? Because
a sensor with a parameter specific for these settings will be available. In the above screen-print example:
a sensor with parameter FOLDER:DIR_GLOBAL will use the presented settings. The sensor without parameters will
ignore these settings (and list all settings without SKIP parameter). Now multiple sensors on the same subject
can be aligned to each report their own focus area.
AbapDoc documentation is gradually becoming a more popular way to document coded components. The sensorboard framework is a fully AbapDoc documented framework, which will show when using Eclipse (with F2 for example).
The Zone is a report that focusses on custom build components - as a webpage about re-usable components. The sensorboard framework is added to the Zone report in 2 parts:
The actual content of the conponents that are listed are editable for developers (through include ZONE_SCRIPT.
The Zone can be an effective way to share re-usable components with the other developers. Not only does it list them, it explains what is there and with a bit of AbapDoc documentation - developers can help developers. After all: a re-usable component that is unknown to others is less-likely to be re-used.
Get your own copy here. It's just a report (with menu and screen) and an include. As developer - you should be just fine applying this to your system.
The main program
Screen 900 for the main program (use transaction
SE51 or double click from the abap sourcecode).
Menu for the main program (use transaction
SE41 or double click from the abap sourcecode).
The script include (create as include).
The full application is set up in 2 languages, for which the I18N (Internationalization) mini-framework was used. The framework caters for setting up language elements (texts) in the language of your choice by hard-coding them into the Abap logic. All applications and all standard sensors were set up in Dutch (nl) and English (en).
The big advantage of embedding text elements into coding is making it easy to apply the coding on multiple systems (without the need for a transport mechanism). The A class with sensors is effectively a single file with class definition, methods for it's sensors and text elements within the methods.
If the text that is displayed on a standard sensor does not explain the issue enough, the text can be overwritten
through the I18N framework. All you would need to do is find out what textpool the sensor is using (this would
typically be sensor.st22 for sensor type ST22) and add your text to the textpool table.
In steps:
sensor.st22).
INFO holds the introduction text for the sensor).
ZI18N_EDITOR and fill in the textpool and text. Focus on the text.
ZI18N_EDITOR application supports NL, EN, DE, IT, FR and ES.
Get your own copy here. It's just a report, a class and a table.
The framework class.
The editor for i18n settings. Also doubles as example report on how to use the framework.
The definition of the textpool(s) table.
To make the application available in other languages, the framework only needs it's textpool table to be filled. All applications (and sensors) will recognise which language to use from the user logon language, so when e.g. the Italian version is available it will be used.
Like the Rosetta stone in report ZI18N_EDITOR, the text for the following languages
are shown in a single screen editor: NL, EN, DE, IT, FR and ES.
Check the versions overview for available translations. At the time of writing there are only 2 languages available. If and when other languages are supported, this will be implemented through a textpool which can also be made available to you.
The mini framework for internationalization is not specific for the sensorboard. It consists of:
ZCL_I18N
ZTEXTPOOL_I18N
ZI18N_EDITOR
The usage of the framework is demonstrated in it's own editor. An instance of the ZCL_I18N is
created, preferrably with a pool (iv_pool). The language ID's that are needed are then
added to the instance of ZCL_I18N using method FEED (single text lines) or
MULTIFEED (multiple text lines). It is also possible to work
with the elements that are stored on the textpool table.
Whenever a text is required in the Abap coding, the get method will provide it. Texts with &-characters
can be used with (up to 3) parameters.
There are also options with e.g. the plural forms of text (texts) like Apple and Apples. And texts consisting of
multiple lines are also supported. Note that the editor only handles up to 3 lines. JSON upload and download or
calls to FEED have no limit to the number of lines processed.
In some cases it may be useful to use the texts from multiple text pools. This can be done with FEED, consider
the example:
* Create a text container with the texts on textpool 'sensor.general' data(lo_i18n) = zcl_i18n=>get_instance( 'sensor.general' ). * Now feed it with the texts from another pool lo_i18n->multifeed( zcl_i18n=>get_instance( 'sensor.specific' )->gt_texts ). lo_i18n->multifeed( zcl_i18n=>get_instance( 'sensor.evenmore' )->gt_texts ).This will only work with the texts that are stored in the textpool table. If the textpools involved share a text ID, then the ID that was first available will be used.
Sensorboards can be displayed just about anywhere, through 2 services.
Overview of available technical objects for this:
Z_Sensorship with custom entity Z_Sensorship_SensorZ_Sensorship_Sensor_Single with custom entity Z_Sensorship_Sensor_ReportZCL_SENSOR_MANAGER_RAP.
@EndUserText.label: 'Sensorboard RAP services'
define service Z_sensorship {
expose Z_Sensorship as SensorBoard;
expose Z_Sensorship_Sensor as Sensor;
expose Z_Sensorship_Sensor_Single as SingleSensor;
expose Z_Sensorship_Sensor_Report as SingleSensorContent;
}
https://xxxxxx.dev.xxxx.nl:8020/sap/opu/odata4/sap/z_sensorship/srvd_a2x
/sap/z_sensorship/0001/SensorBoard('NL')
/Set?$select=GroupName,Title&$expand=_Sensors($select=KPI,UoM,Title,Status)
Would produce a list of the (all) available sensors. Like so:
{
"@odata.context" : "../$metadata#SensorBoard('NL')/Set(GroupName,Title, _Sensors(KPI,UoM,Title,Status,Sensor,ParameterValue))",
"@odata.metadataEtag" : "W/\"20250317171116\"",
"value" : [
{
"GroupName" : "CONSISTENCY",
"Title" : "Data consistentie",
"_Sensors" : [
{
"Sensor" : "BUT0ID",
"ParameterValue" : "",
"Status" : "",
"KPI" : 53,
"UoM" : "duplicaten",
"Title" : "NXR duplicaten"
},
{
"Sensor" : "BUT0ID",
"ParameterValue" : "RELATION:Z00025",
"Status" : "",
"KPI" : 0,
"UoM" : "duplicaten",
"Title" : "CloudID duplicaten"
},
....
Note that this call returns only a small subset of the available data, as the $select was used
to specify requested fields.
Also note that filtering is available for the relevant fields (GroupName, Priority, UserIsSubscribed, Sensor,
ParameterValue, Status and LogChangedRecently).
https://xxxxxx.dev.xxxxx:44302/sap/opu/odata4 /sap/z_sensorship/srvd_a2x/sap/z_sensorship/0001 /SingleSensor(p_groupname='SYSTEMHEALTH',p_sensor='ST22', p_parametervalue='',p_language='NL')/Set ?$expand=_ReportWhich would present something very similar to
{
"@odata.context" : "../$metadata#SingleSensor(p_groupname='SYSTEMHEALTH',
p_sensor='ST22',p_parametervalue='',p_language='NL')/Set(_Report())",
"@odata.metadataEtag" : "W/\"20250317171116\"",
"value" : [
{
"GroupName" : "SYSTEMHEALTH",
"Sensor" : "ST22",
"ParameterValue" : "",
"Status" : "",
"KPI" : 7,
"UoM" : "dumps",
"Title" : "Dumps",
"MeasurementDate" : "2025-03-31",
"MeasurementTime" : "22:12:41",
"StatusDate" : "2025-01-26",
"StatusTime" : "12:44:00",
"SequenceOnBoard" : "0410",
"DocumentationLink" : "",
"WarningLimit" : 0,
"ErrorLimit" : 0,
"CreatedByBapi" : "",
"TrackHistory" : "",
"Delay" : 0,
"LogId" : 22,
"_Report" : [
{
"LineNumber" : 0,
"lineType" : "LABEL",
"Content" : "In status sinds: Zondag 26.01.2025 om 12:44"
},
{
"LineNumber" : 1,
"lineType" : "HISTORY",
"Content" : "22"
},
{
"LineNumber" : 2,
"lineType" : "INFO",
"Content" : "Dumps kunnen worden getoond via transactie ST22. Deze sensor werkt met een white list"
},
{
"LineNumber" : 3,
"lineType" : "INFO",
"Content" : "en een black list waarin specifieke dumps kunnen worden aangegeven."
},
{
"LineNumber" : 4,
"lineType" : "INFO",
"Content" : ""
},
{
"LineNumber" : 5,
"lineType" : "INFO",
"Content" : "De white list is voor runtime fouten die (door de sensor) genegeerd kunnen worden. Black list dumps zijn"
},
{
"LineNumber" : 6,
"lineType" : "INFO",
"Content" : "juist heel belangerijk, omdat ze bijvoorbeeld over memory gaan."
},
{
"LineNumber" : 7,
"lineType" : "INFO",
"Content" : "Deze sensor is voorzien van een whitelist (niet tonen) en blacklist (met prioriteit tonen)"
},
{
"LineNumber" : 8,
"lineType" : "INFO",
"Content" : "dump selectie die is opgenomen in de sensor-tekst."
},
{
"LineNumber" : 9,
"lineType" : "MESSAGE",
"Content" : "Er zijn 3 white-listed en 14 black-listed dump codes."
},
{
"LineNumber" : 10,
"lineType" : "MESSAGE",
"Content" : "Dumps selectie (zonder lock) van vandaag"
},
{
"LineNumber" : 11,
"lineType" : "SUBTITLE",
"Content" : "Overzicht per gebruiker"
},
{
"LineNumber" : 12,
"lineType" : "TABLEHDR",
"Content" : "Telling;Gebruiker;Dialoog gebruiker"
},
{
"LineNumber" : 13,
"lineType" : "TABLELINE",
"Content" : "4;~G009154;Ja"
},
{
"LineNumber" : 14,
"lineType" : "TABLEEND",
"Content" : ""
},
{
"LineNumber" : 15,
"lineType" : "SUBTITLE",
"Content" : "Overzicht van de dumps"
},
{
"LineNumber" : 16,
"lineType" : "TABLEHDR",
"Content" : "Telling;Mandant;Dump;Prioriteit"
},
{
"LineNumber" : 17,
"lineType" : "TABLELINE",
"Content" : "2;~120;OBJECTS_OBJREF_NOT_ASSIGNED_NO;"
},
{
"LineNumber" : 18,
"lineType" : "TABLELINE",
"Content" : "4;~120;SAPSQL_DATA_LOSS;"
},
{
"LineNumber" : 19,
"lineType" : "TABLELINE",
"Content" : "1;~120;SYNTAX_ERROR;"
},
{
"LineNumber" : 20,
"lineType" : "TABLEEND",
"Content" : ""
},
{
"LineNumber" : 21,
"lineType" : "MESSAGE",
"Content" : "Er zijn 3 dumps onderdrukt (wegens whitelist en/of blacklist met prioriteit)"
},
{
"LineNumber" : 22,
"lineType" : "SUMMARY",
"Content" : "<hr>"
},
{
"LineNumber" : 23,
"lineType" : "SUMMARY",
"Content" : "<section class=footer>"
},
{
"LineNumber" : 24,
"lineType" : "SUMMARY",
"Content" : "Algemene informatie over de sensor:"
},
{
"LineNumber" : 25,
"lineType" : "SUMMARY",
"Content" : "waarschuwing: <i>geen waarschuwingslimiet</i>,"
},
{
"LineNumber" : 26,
"lineType" : "SUMMARY",
"Content" : "fout: <i>geen foutenlimiet</i>,"
},
{
"LineNumber" : 27,
"lineType" : "SUMMARY",
"Content" : "sensor naam: <i>ST22 Dumps</i>,"
},
{
"LineNumber" : 28,
"lineType" : "SUMMARY",
"Content" : "parameter waarde: <i>(geen waarde)</i>,"
},
{
"LineNumber" : 29,
"lineType" : "SUMMARY",
"Content" : "class/methode: <i>ZCL_SENSORS_STANDARD=>SENSOR_ST22</i>,"
},
{
"LineNumber" : 30,
"lineType" : "SUMMARY",
"Content" : "duur: <i>46ms</i>."
},
{
"LineNumber" : 31,
"lineType" : "SUMMARY",
"Content" : "</section>"
}
]
}
]
}
The important thing to note here is that the sensor was executed and its renewed KPI results were logged on the
ZSENSORS table. In theory (though not very practical) some external system could control when sensors
are executed (and thus updated) - using this very RAP service.
Each sensor is a report that was composed for the sensor. Some reveal very little information, others hold a table
with the used settings and another table with detailed information in up to 9 columns. The information is made available
in association _Report which is composed of a series of components or lines. Each component has a LineNumber
and a LineType. Make sure they are processed in the LineNumber sequence.
An overview of the line types (LineType) and their meaning:
The title of the sensor.
Template: |<h2>{ content }</h2>|
The subtitle of the sensor.
Template: |<h3>{ content }</h3>|
Sensor general information, explaining what the sensor does and what tools are available to follow up.
Template: |not applicable|
Can be ignored.
Template: |not applicable|
Show a bulleted message.
Template: |<br><b>o</b> { content }|
Show a labeled field, with field name and field value (separated by a :).
Template: |<table><tr><td style="width:80px;"></td><td class=fieldlabel>{ field }</td><td>{ value }</td></tr></table>|
Show a labeled field, with field name and field value (separated by a :). The field value is an Url.
Template: |<table><tr><td style="width:80px;"></td><td class=fieldlabel>{ field }</td>|
<td><a href={ value } target = new>{ value }</a></td></tr></table>
A table header line, with column names. A list of names separated by a ;
Template: |<table><tr><td>{ column1 }</td><td>{ column2 }<td></tr></table>|
A table header line, with column values. A list of values separated by a ;
Note that numeric fields can be displayed as character fields by preceding the value with ~.
Note that a table line without column separators (;) will occupy the whole line (colspan=10).
Template: |<table><tr><td>{ value1 }</td><td>{ value2 }<td></tr></table>|
End the table (mandatory).
Template: |</table>|
Logging the KPI results of each sensor can be switched on (and off) any time. The logging results are held on table
ZSENSORLOGS. Note that the log is designed to capture deviations only, thus when a KPI value is stable the framework
will only adjust the end date and end time on the log.
When logging information is available, it will be presented as SVG graphics on the sensor tile information. It can
also be viewed on the sensor settings application, as ALV report. Note that the logging details are shown up to T-30
days (up to 30 days ago). There is also a T-90 days overview. Keeping records older than 90 days is only relevant if
the ALV report from sensor settings is used (or if the sensor log table itself is used). Housekeeping on logs can be
done in the ZSENSORS_ENGINE report. This will effect logs from all sensors.
The sensorboard also hosts a more elaborate logging feature: the detailed log. This logs everything from a given measurement. Detailed logs should not be composed too often, but they can be composed ad-hoc at any moment. Ad-hoc logging can be done for any sensor, directly from the Sensorboard by selecting CTRL-Click on the required sensor. This logging is done even if logging is not switched on on the sensor. Functionality is also available from the sensor settings application or from the sensor detailed comparison report. Sensors can also be flagged for "Detailed logging" on the sensor settings. This should be arranged in combination with tne sensor engine background report. The job frequency and timing determine when sensor-detail-snapshots will be captured.
The sensor comparison report is available directly from the ZEN transaction and also from the sensor settings
application. Start the report, select a record and select "Compare". The selected record will be compared with a
fresh run of the sensor. It is also possible to select 2 lines with historic detail and compare them with each other.
1. Disclose sensor logic to an external sensorboard
The whole concept of the sensorboard originates from network sensorboards. When systems need to be monitored a
network sensorboard can be used to monitor whether systems are active and responsive. The sensorboard system would
be a system on it's own and not part of the system it's monitoring. With a single service (to be added to the
system) the sensors that are created on this board can be disclosed to an external board. This would take the sensor
board setup to higher level, also involving other systems.
2. A sensor on another board
The sensorboard is all about what is happening on a system. But what if there are multiple systems in your landscape ?
Sensor REMOTE can report on the errors from the Sensorboard setup of another system. All that would be required for that
is an active RFC destination. From one of the boards, other boards can be monitored.
3. The full sensorboard as oData services
The groups and sensors on the board can also be disclosed as oData service definition to SAP gateway. A RAP service
is readily available for this purpose (separate paragraph on "oData sensorboard".
Some (functional) sensors can be required for functional objects such as a sales organization or maybe a project.
And these objects may also have a life-cycle, e.g. projects that are no longer active will no longer require a sensor.
A separate report can be set up with the task of composing a list of required sensors. And also composing a list of
no longer required sensors. ZCL_SENSOR_MANAGER=>BAPI_GROUP and ZCL_SENSOR_MANAGER=>BAPI_SENSOR are available for
this task. This enables the sensorboard to automatically stay up to date on the actual sensors on the board.
Each of which will provide up-to-date KPI's.
Consider this usage-example: an analytical index sensor is in place, which compares the value of sales orders created over the past 10 days to the total value of sales orders from the period of 10 days that superceded. Thus 20 days of order value information to create an AEX-index like result "+6.355 %".
The details on this sensor report a bit more in-depth data, showing the values per customer.
A batch job is created (according to the ZSENSORS_BOARD_FEEDER example report) which will run the above sensor and
derives the top 10 customers with the highest order values for the last period. The batch job will remove the sensors
that were created in previous runs and add the new top-ten list to the board. As this is done only once a day, the
sensor framework will start executing these sensors.
The result is that the main sensor will report overall turnover progress, where the 10 sensors next to the main sensor reveals the focus on the largest customers.
Note that sensors that were created by Bapi are flagged as such. Visible in the Sensor editor.
Where a sensor is aimed at getting details on problems, these details can also be used to fix the problems in
some automated way. Thus when a sensor reports on an issue on an order, the issue could be resolved with an order
change. The framework does more than just report on the problem. It can also make the list of problems available
through a BAPI: ZCL_SENSOR_MANAGER=>BAPI_EXECUTE_SENSOR will execute the sensor, compose the list of errors/issues and
update the system with the newly acquired KPI results. The BAPI will also make sensor details available through it's
return parameters. Parameter ET_DETAILS contains a table with sensor content elements, which can be used to find
reported details. Parameters ET_ALV_HEADER and ET_ALV_DATA contain a table with column headers and actual data from
the sensor. Use report ZSENSORS_REPORTER to view this data. It is extracted from the last (and main) sensor results
table.
The information from the BAPI can then be used as a work-list for automatic fixes. Once the fix is applied, the sensor's next run will (should) detect it's effects, which concludes the auto-fix cycle.
The standard sensor types sometimes come with a fixer report that can automatically resolve issues (often
by deleting data that has gone past it's retention period). Fixer reports have a naming convention ZSENSOR_FXR_{sensortype}.
Feel free to apply this naming convention on your own fixer reports.
The design of a sensor and it's sensor text settings is not ideal for sensor types that have sensor-specific settings.
The setup is that a parameter-string can be set for a sensor - to control deviating behaviour. These parameters are
limited in size and are always uppercased. For the SQL sensor, the long text is used to describe the
selection the sensor should perform. As the sensor can be applied multiple times, sensor parameters are used to select
which text-set should be used.
Class ZCL_SENSORS_ALIAS is available to make 4 sensor types available as alias. They work exactly like
their originals, but they have "their own" sensor long text settings. As standard (but also as example) an alias sensor
is available for SM37 batch jobs, TABLES Tables, SQL SQL selections and SQLINDX
SQL Index - as these are the common candidates for an alias.
Use the ZCL_SENSORS_ALIAS class as example if you need more aliasses. The naming convention for these is
_2, _3 and so on.
The sensorboard is composed with an HTML page for which CSS styling was used. The tiles for each sensor have lines, a shadow, text sizes, colors and many more very customizable settings. To make changes possible, CSS script changes can be applied to the HTML template for the sensorboard. It was already possible to set a background image and it is also possible to apply other CSS related changes.
To determine what additions to apply, a web browser with a sensorboard as HTML in it should be available. As this is not available from a SAPGUI session (the "browser" as it is displayed in SAPGUI a very limited version comparing to Explorer or Chrome), a trick needs to me done to create a stand-alone HTML sensorboard. Here's how:
MOCKUP in the command box. This will trigger some hidden functionality.
To apply your settings, the SENSOR self service sensor text setting need to be changed. Just add a
block to the settings, as per example:
/: CSS
* table.sensor tr td.since { font-size:8pt;color:gray; }
The example settings will make the "12u34m" texts on the sensor tile less prominent (smaller and lighter colored).
The system will involve your settings on the sensorboard, without changing any abap coding or risking damaging the board output (which has been a delecate part of the solution).
The sensor engine architecture does not lock a program run, but it does lock a sensor check. This means that even if the sensor engine is scheduled to run every minute and the job would be scheduled three times (simultaneously), sensors would be updated very regularly and the framework would run super fast. At a heartbeat rate of 3 times per minute.
To make this a bit more practical, a heart-beat sensor engine job could be scheduled every 3 minutes. A secondary heart-beat sensor engine job could be scheduled every minute, to operate only on a predefined set of "high-priority" groups (specified on the sensor engine selection screen). One could even consider scheduling jobs with multiple steps, to make the engine perform multiple check runs per minute.
If there is a need for this speed - the architecture will support it.
The always up-to-date overview for system-wide health monitoring
We use cookies to improve your experience. By continuing, you agree to our cookie policy.