Table of Contents
ALM Real User Monitoring Monitor
Retrieves RUM metrics from SAP Cloud ALM API. Publishes time-series metrics and evaluates alarms per configured rule.
- API:
GET /api/calm-metrics/v1/metrics?provider=rum
Prerequisites
Cloud ALM Connector (required)
Requires a Web Service connector with authentication type CLOUD_ALM.
Based on a service key from the SAP Cloud ALM API service instance in the BTP subaccount.
Required OAuth scopes in the authorities list of the instance parameters:
$XSMASTERAPPNAME.calm-api.hm.read$XSMASTERAPPNAME.calm-api.metrics.read$XSMASTERAPPNAME.calm-api.rum.personal.read(optional) needed to see real user names. Without it user names appear anonymized.
API Endpoints
| Endpoint | Purpose |
|---|---|
| POST /oauth/token | Authentication (BTP UAA) |
| POST /api/calm-analytics/v1/analytics/providers/filters | Fetch RUM service IDs and labels (data collection) |
| GET /api/calm-landscape/v1/landscapeObjects | Fetch landscape objects (data collection) |
| GET /api/calm-metrics/v1/metrics?provider=rum | Retrieve RUM metrics |
Key Features
- Publishes six metric types per RUM datapoint:
responseTimeusersrequestsokStatuswarningStatuscriticalStatus - Per-row thresholds with standard
G2W:80 W2M:90syntax. Multi Threshold Syntax Attributes Filternarrows which datapoints a row evaluatesExclusivecontrols whether a matched datapoint is consumed or passed to later rows- Glob support for
MetricandService namefields (*= all; note: partial globs like*Statusdo NOT work onMetric) - Optional alarm tag for grouping or routing
- Auto-clear when alarm condition no longer matches
- Load Services button: auto-discovers RUM service IDs and labels from the live tenant and populates
Service nameandService IDin the table
Data Collection
Data collection populates Service name and Service ID from the Cloud ALM landscape. It calls the RUM analytics filters API to resolve the exact service labels used by the metrics API (e.g. S4H.100 not S4H).
Always run data collection before adding rows. A service name not returned by data collection will not match what the metrics API returns and the row will never apply.
Data collection runs two calls:
POST /api/calm-analytics/v1/analytics/providers/filterswith body{“providerName”:“DP_RUM_REQUEST_TYPES”,“providerVersion”:“v1”}— returns the RUM service filter list. Extracts each service UUID and its label (e.g.S4H.100).GET /api/calm-landscape/v1/landscapeObjects— returns all landscape objects. Each object is checked against the RUM map. If found the RUM label is used asService name. If not found the landscape name is used as fallback.
If the first call fails data collection falls back to showing all landscape objects without RUM label resolution.
Why the label matters: the metrics API returnsservice.name = S4H.100. The landscape object name isS4H. Without label resolutionS4H*would fail to matchS4H.100and no rows would apply.
Click Load Services to run data collection and populate the surveillance table.
Configuration
Method 1: Load Services
- Open monitor configuration
- Click Load Services
- Table populates with
Service nameandService IDfrom the live tenant - Enable rows, set thresholds, save
Method 2: Manual / Wildcard
- Set
Metric=*and/orService name=*to match all - Use only service labels returned by data collection. Do not invent service names.
Settings Reference
| Field | Type | Default | Description |
|---|---|---|---|
| Active | Boolean | true | Enable or disable this row |
| Service name | String | * | Glob matched against RUM service label e.g. S4H.100. * = all. Populated by data collection |
| Service ID | String | (empty) | UUID of service. Auto-populated by data collection. Do not edit manually |
| Metric | String | * | Metric type to match. Exact values only or *. See Metric types |
| Attributes Filter | String | (empty) | Narrows datapoints. Format: key:value,key2:value2. Empty = no restriction |
| Thresholds | String | G2W:80 W2M:90 | Alarm thresholds. Multi Threshold Syntax |
| Alarm tag | String | (empty) | Optional tag appended to alarm message |
| Exclusive | Boolean | true | If true datapoint is consumed by this row and not re-evaluated by later rows |
| Alarm | Boolean | true | Enable alarm evaluation for this row |
| Metric | Boolean | true | Publish metric datapoints for this row. If false evaluate alarms only |
Metric types
| Value | Description |
|---|---|
| criticalStatus | Count of requests in critical state |
| okStatus | Count of requests in ok state |
| warningStatus | Count of requests in warning state |
| responseTime | Average response time in ms |
| requests | Total request count |
| users | Distinct user count |
| * | All of the above |
Attributes Filter
Narrows which datapoints a row matches. All clauses must match (AND). Matching is case insensitive. Malformed clauses are silently ignored.
| Attribute | Description | Example |
|---|---|---|
| request | RFC or HTTP request name | /SDF/AJM_EXECUTE_EXM |
| requestType | Protocol type | RFC RFCS HTTP |
| user | Hashed user identifier | a3f9c… |
| microService | Logical system name | S4H100 |
Example filter value:
request:/SDF/AJM_EXECUTE_EXM,requestType:RFC
Filter Evaluation Order
- No rows configured: publish all metrics. No filtering. Backward compatible.
Service name: glob matched against RUM service label.S4H*matchesS4H.100.*matches all.Metric: exact match only.*matches all types. Partial globs like*Statusdo NOT work.Attributes Filter: all clauses must match. Empty = match all datapoints.Exclusive = true: datapoint consumed by first matching row. Later rows skip it.Metric = false: row evaluates alarms but publishes no metric datapoints.
Collected Metrics
Base key: promonitor.cloud_alm.rum.*
| Metric key | Unit | Description |
|---|---|---|
promonitor.cloud_alm.rum.<metric>.responseTime | ms | Average response time |
promonitor.cloud_alm.rum.<metric>.users | count | Distinct user count |
promonitor.cloud_alm.rum.<metric>.requests | count | Total request count |
promonitor.cloud_alm.rum.<metric>.okStatus | count | Requests in ok state |
promonitor.cloud_alm.rum.<metric>.warningStatus | count | Requests in warning state |
promonitor.cloud_alm.rum.<metric>.criticalStatus | count | Requests in critical state |
Tags published with each datapoint: service.name sap.service.name service.namespace service.instance.id sap.service.display_name request requestType user microService
Examples
1. Publish all metrics for all services
No rows needed. Empty table = publish everything.
2. Monitor only responseTime for service S4H.100
| Active | Service name | Metric | Attributes Filter | Thresholds | Exclusive | Alarm | Metric |
|---|---|---|---|---|---|---|---|
| true | S4H.100 | responseTime | (empty) | G2W:80 W2M:90 | true | true | true |
Other metric types for S4H.100 are not published.
3. Monitor only one request across all metric types
| Active | Service name | Metric | Attributes Filter | Thresholds | Exclusive | Alarm | Metric |
|---|---|---|---|---|---|---|---|
| true | * | * | request:/SDF/AJM_EXECUTE_EXM | G2W:80 W2M:90 | true | true | true |
All six metric types published. Only datapoints where request = /SDF/AJM_EXECUTE_EXM.
4. Alarm on responseTime without publishing metrics
| Active | Service name | Metric | Attributes Filter | Thresholds | Alarm tag | Exclusive | Alarm | Metric |
|---|---|---|---|---|---|---|---|---|
| true | * | responseTime | request:/SDF/AJM_EXECUTE_EXM | G2W:2000 W2M:3000 | SLOW_REQ | true | true | false |
Metric = false: alarms fire but no datapoints written to time-series.
5. Two requests with different thresholds
| Active | Service name | Metric | Attributes Filter | Thresholds | Alarm tag | Exclusive | Alarm | Metric |
|---|---|---|---|---|---|---|---|---|
| true | * | responseTime | request:/SDF/AJM_EXECUTE_EXM | G2W:1000 W2M:2000 | REQ_A | true | true | true |
| true | * | responseTime | request:/UI2/PAGE_BUILDER_PERS | G2W:500 W2M:1500 | REQ_B | true | true | true |
Row 1 consumes datapoints for first request (Exclusive = true). Row 2 handles second request independently.
6. Publish only request counts for RFC calls
| Active | Service name | Metric | Attributes Filter | Thresholds | Exclusive | Alarm | Metric |
|---|---|---|---|---|---|---|---|
| true | * | requests | requestType:RFC | G2W:80 W2M:90 | true | true | true |
Only requests metric published. Only datapoints where requestType = RFC.
Troubleshooting
| Symptom | Check |
|---|---|
| Empty table after Load Services | Connector uses CLOUD_ALM auth. Service key is valid. Tenant has active RUM data. |
| Service name in row does not match | Run data collection again. Use only labels returned by Load Services. Do not type service names manually. |
| HTTP 401 or 403 | Regenerate service key in BTP instance. Verify OAuth scopes are set. |
| Metrics show 0 but Cloud ALM has data | Some measures legitimately report 0. Check filter and attribute values match actual data. |
| Alarms not triggering | Row is Active. Alarm is enabled. Metric and Service name match incoming data. Threshold syntax is correct. |
| No metrics stored when data exists | Enable Metric on the relevant row. |
| User names appear anonymized | Add $XSMASTERAPPNAME.calm-api.rum.personal.read scope to the service instance. |
Limitations
Metricfield does not support partial glob patterns.*Statusdoes NOT matchcriticalStatus. Use exact values or*.Service IDis auto-populated. Manual entry not supported.- Malformed
Attributes Filterclauses are silently ignored. Validate format before saving. Exclusive = truemeans first matching row wins. Order rows from most specific to most general.- Thresholds apply to the raw numeric value of the selected metric.
