5 Generating Unrated 5G CDRs with CHF and CGF
You can generate unrated 5G call detail records (CDRs) by using the Oracle Communications Elastic Charging Engine (ECE) composable services. You might want unrated CDRs for roaming partners, data warehousing, and legacy billing systems.
Topics in this document:
About Generating 5G Unrated CDRs with CHF and CGF
The ECE composable services generate and process unrated 5G CDRs by using the Charging Manager (CHF) and Charging Gateway Function (CGF) composable services. The CHF receives charging requests from 5G network functions, such as the Session Management Function (SMF), and publishes unrated charging events to the CHF-CGF Kafka topic. The CGF consumes and processes these events and publishes unrated 5G CDRs for downstream systems and northbound consumers.
The CGF composable service uses a cnDBTier as a persistent state store for operational and processing data. During unrated 5G CDR processing, cnDBTier stores CDR state, processed ISNs, retry records, deduplication data, and durable publishing information. This enables CGF to track aggregation state, detect duplicate, missing, and out-of-order events, support retry and recovery workflows, maintain sequencing and gap-handling data, and persist failed Kafka publication retries. As the authoritative state store, the cnDBTier ensures reliable CDR processing during retries, failovers, Kafka outages, and multisite recovery scenarios.
The ECE composable services support unrated CDR replication to enhance service resiliency and operational continuity in multisite deployments. This capability improves sequencing accuracy, duplicate detection, and aggregation consistency during transaction failover scenarios, helping ensure reliable and uninterrupted processing across sites.
Note:
In contrast, ECE with CDR Gateway relies on an Oracle database that does not support replication. As a result, during a transaction failover, the system cannot reliably determine whether another site has already processed the transaction. For information about ECE with CDR Gateway, see "Generating CDRs for External Systems" in ECE Implementing Charging.
High-Level Configuration Tasks for Generating Unrated 5G CDRs
You can generate unrated 5G CDRs using the ECE CHF and CGF composable services by integrating CHF and CGF into an existing ECE cloud native deployment.
To configure the ECE to generate unrated CDRs with CHF and CGF:
-
Ensure you have installed and configured all prerequisite software, such as Kafka Server and Oracle cnDBTier.
-
Create an override-values.yaml file for the ECE composable services Helm chart.
-
Configure the mandatory values for generating unrated CDRs for 5G clients.
See "Configuring Mandatory Values for Generating Unrated CDRs".
-
Configure the CHF composable service to send unrated events to the CGF composable service through the CHF-CGF Kafka topic.
See "Configuring the Charging Manager to Generate Unrated CDRs".
-
Configure the CGF composable service to aggregate and clean up unrated events, convert them into 5G unrated CDRs, and send them to 5G clients through the CGF-CDR Kafka topic.
See "Configuring the Charging Gateway Function to Generate Unrated CDRs".
-
Do one of the following:
-
If you are replacing the CDR Gateway component in your existing ECE deployment with the ECE CHF and CGF composable services, see "Migrating the CHF and CGF Composable Services into an Existing ECE System".
-
If you are deploying CHF and CGF in a standalone cloud native environment, see "Deploying the ECE Composable Services".
-
-
Set up your external system to consume the unrated 5G CDRs from the CGF-CDR Kafka topic.
Configuring Mandatory Values for Generating Unrated CDRs
To configure the ECE composable services to generate unrated 5G CDRs, set the following keys in your override-values.yaml file for oc-ccs-version. These keys are required to create a simple or demonstration version that you can use immediately.
These keys apply to all ECE composable services, but you can override them for a specific composable service by setting a different value in the composable service's key. For example, to use a different pull policy for the Charging Gateway Function composable service, set the cgf.imagePullPolicy key.
Note:
The &keyName and *keyName values are Helm references. If a key in the values.yaml file includes one of these references, you must also include the reference in your override-values.yaml file.
imageRepository: &imageRepository ""
imagePullSecrets: &imagePullSecrets
imagePullPolicy: &imagePullPolicy IfNotPresent
nodeSelector: &nodeSelector {}
partOfLabel: &partOfLabel oc-ccs
additionalLabels: &additionalLabels { }
annotations: &annotations { }
# shared webserver defaults
webserverDefaults: &webserver
maxPayloadSize: 2000000
# common component images
dbClientImage: &dbClientImage "ccs/infra/db-client:15.2.0.0.2"
# ccs converged charging component images
nrfManagementImage: &nrfManagementImage "ccs/nrf-management:15.2.0.0.2"
nchfConvergedChargingImage: &nchfConvergedChargingImage "ccs/chf/nchf-converged-charging:15.2.0.0.2"
cgfImage: &cgfImage "ccs/charging-gateway:15.2.0.0.2"
# database services
db:
cgf:
serviceHostname: &db-cgf-serviceHostname
adminCredentialsSecretName: &db-cgf-adminCredentialsSecretName
serviceCredentialsSecretName: &db-cgf-serviceCredentialsSecretName
loggingPattern: &loggingPattern "%d{ISO8601_OFFSET_DATE_TIME_HHCMM} | %5p | %X{traceId} | %-20.20thread | %-25.25logger{25} | %m%n"
tracingEnabled: &tracingEnabled false
tracingHost: &tracingHost otlp-collector-host
tracingPort: &tracingPort 14250
nchfTopicName: &nchfPublisherTopicName nchf-cgf-cdr
nchfCdrMultiSite: &nchf-cdr-multisite
enabled: false
coordinationId: "nchf-cdr-coordination"
failoverMode: ALL_REMAINING
kafkaFailoverStabilizationWindow: "PT0S"
remoteSites:
- site2
- site3
kafka-brokers:
ccs-broker-producer-1: &ccs-broker-producer-1
name: ccs-broker-producer
bootstrapServers: kafka:9093
auth:
enabled: true
tls:
trustStore:
existingSecret: cgf-billing-cluster-ca-cert
passwordKey: ca.password
keystore:
existingSecret: cgf-billing-user
passwordKey: user.password
extraConfig:
reconnect.backoff.ms: "100"
reconnect.backoff.max.ms: "1000"
max.block.ms: "30000"
request.timeout.ms: "15000"
delivery.timeout.ms: "60000"
ccs-broker-consumer-1: &ccs-broker-consumer-1
name: ccs-broker-consumer
bootstrapServers: kafka:9093
auth:
enabled: true
tls:
trustStore:
existingSecret: cgf-cluster-ca-cert
passwordKey: ca.password
keyStore:
existingSecret: nchf-user
passwordKey: user.password
extraConfig:
auto.offset.reset: latest
reconnect.backoff.ms: "175"
reconnect.backoff.max.ms: "1000"
allow.auto.create.topics: "false"
serviceMonitor: &serviceMonitor
enabled: false
namespace:
additionalLabels: {}
grafanaDashboards: &grafanaDashboards
enabled: false
grafanaNamespace:
labels:
grafana_dashboard: "1"
annotations:
k8s-sidecar-target-directory: "/tmp/dashboards/ccs"Table 5-1 describes each key.
Table 5-1 Mandatory Keys for Generating Unrated CDRs
| Key | Description |
|---|---|
|
imageRepository |
The registry server where you pushed images, typically in this format: RepoHost:RepoPort. This value is added as a prefix to all image names when you install or upgrade Helm charts. |
|
imagePullSecrets |
The name of the Secret that contains credentials for accessing images from your private image server. The default is regcred. This value is added to each pod to permit it to pull the image from your private registry server. See "Creating Secrets for Container Registry Authorization" for more information. |
|
imagePullPolicy |
When Kubernetes pulls images:
|
|
nodeSelector |
The nodes on which to deploy the ECE composable services. Labels appear underneath nodeSelector in a set of key-value pairs. |
|
partOfLabel |
The value to assign to the composable service's app.kubernetes.io/part-of label. This label identifies the application that the resource belongs to. The default is oc-ccs. |
|
additionalLabels |
The labels map used when the ECE composable services are deployed. |
|
annotations |
The key-value map, which is read to determine behavior or actions. |
|
webserverDefaults.maxPayloadSize |
The maximum size of data in the request body. |
|
dbClientImage |
The name of the Database Client image. The default is ccs/infra/db-client:15.2.0.0.2. |
|
nrfManagementImage |
The name of the NRF image. The default is ccs/nrf-management:15.2.0.0.2. |
|
nchfConvergedChargingImage |
The name of the nCHF image. The default is ccs/chf/nchf-converged-charging:15.2.0.0.2. |
|
cgfImage |
The name of the CGF image. The default is ccs/charging-gateway:15.2.0.0.2. |
|
db.cgf.* |
The details about the database services for CGF.
|
|
loggingPattern |
The structure, format, and content of log messages. |
|
tracingEnabled |
Whether tracing through Jaeger is enabled. The default is false. |
|
tracingHost |
The host name for the Jaeger server. The default is jaeger-all-in-one.jaeger.svc.cluster.local. Note: This key applies only if tracing is enabled. |
|
tracingPort |
The port number for Jaeger. The default is 14250. Note: This key applies only if tracing is enabled. |
|
nchfTopicName |
The name of the CHF-CGF Kafka topic. The CHF publishes unrated events to this topic. The default is nchf-cgf-cdr. |
|
nchfCdrMultiSite.* |
The details for deploying the CGF on multiple sites.
|
|
kafka-brokers.ccs-broker-producer-1 |
The details for connecting the producer to the Kafka Server:
|
|
kafka-brokers.ccs-broker-consumer-1 |
The details for connecting the Charging Gateway consumer to the Kafka Server:
|
|
serviceMonitor.* |
The details for the Service Monitor:
|
|
grafanaDashboards.* |
The details for the Grafana Dashboards:
|
Configuring the Charging Manager to Generate Unrated CDRs
When configured for unrated 5G CDR processing, the CHF receives charging requests from 5G network functions, converts them into unrated events, and publishes the unrated events to the CHF-CGF Kafka topic.
To configure the CHF pod, set the following keys in your override-values.yaml file:
nchfConvergedCharging:
enabled: true
imageRepository: *imageRepository
imagePullSecrets: *imagePullSecrets
imagePullPolicy: *imagePullPolicy
partOfLabel: *partOfLabel
webserver: *webserver
nchfConvergedCharging:
name: nchf-converged-charging
fullname: "nchf-converged-charging"
additionalLabels: *additionalLabels
annotations: *annotations
nodeSelector: *nodeSelector
container:
image: *nchfConvergedChargingImage
mutatorRulesConfigMapOverride:
restServices:
- name: "ConvergedCharging"
type: NCHF_CONVERGED_CHARGING
config:
path: "/nchf-convergedcharging/v3/chargingdata"
ingressOrigin:
processors:
- name: mediation-processor
type: COMPOSITE_PROCESSOR
processors:
- name: mutation-processor-standin
producerOnly: true
type: LOGGING_PROCESSOR
config:
logLevel: INFO
atMostSeconds: 10
- name: nchf-processor
type: NCHF
config:
subscriberValidator:
enabled: false
config:
baseUri: "http://subscriber-profile-repository:8080/subscriberProfileRepository/v1"
sessionManager:
enabled: false
config:
baseUri: "http://session-manager:8080/sessionManager/v1"
expiryIntervalInSeconds: 300
processors:
- name: transform-nchf-request
type: MUTATOR_PROCESSOR
config:
rules:
- source: INLINE
rule:
ruleName: onlineSessionIdEnricher
criterion:
expression:
nchfRequest:
criteriaType: MVEL_EXPRESSION
expression: "value.requestType == RequestType.CREATE && value.isOnlineChargingRequest()"
mutation:
expression:
associatedSession:
- mutationType: MVEL_TRANSFORM
expression: "value.id = 'online_'+value.id"
- name: cdrPublisher
type: KAFKA_PUBLISHER_PROCESSOR
config:
publisher:
name: nchf
topic:
name: nchf-cgf-cdr
numberOfPartitions: 2
replicationFactor: 2
create:
enabled: true
modification:
enabled: true
keyGenerations:
- criteria: $.subscriberIdentifier
keyPaths:
- $.subscriberIdentifier
broker: *ccs-broker-producer-1
networkFunction:
nfProfile: &profileFile nfProfile.json
existingNfProfileConfigMap: &existingNfProfileConfigMap
terminationGracePeriodSeconds: 60
resources:
memoryRequest: "256Mi"
cpuRequest: "250m"
memoryLimit: "512Mi"
cpuLimit: "500m"
replicas: 1
jvmOpts: "-XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:InitialRAMPercentage=80 -XX:MaxRAMPercentage=80 -XX:MinRAMPercentage=80 -Dlog4j.configurationFile=/app/config/log4j2.yaml"
restartCount: 0
service:
additionalLabels: *additionalLabels
additionalAnnotations: *annotations
type: ClusterIP
adminService:
additionalLabels: *additionalLabels
additionalAnnotations: *annotations
type: ClusterIP
logging:
format:
type: TEXT
pattern: *loggingPattern
rootLevel: INFO
packageLogging:
- name: com.oracle.cagbu
level: INFO
- name: io.helidon
level: INFO
tracing:
enabled: *tracingEnabled
service: nchf-converged-charging
maxQueueSize: 42
flushIntervalMs: 10001
host: *tracingHost
port: *tracingPort
samplerType: ratio
samplerParam: 0.01
samplerManager:
logSpans: true
webServer:
spans:
httpRequest:
contentWrite: false
contentRead: false
hpa:
enabled: true
minReplicas: 1
maxReplicas: 8
metrics:
cpuAverageUtilization: 65
scaleDown:
selectPolicy: Max
stabilizationWindowSeconds: 300
periodSeconds: 180
scaleUp:
selectPolicy: Max
stabilizationWindowSeconds: 5
periodSeconds: 20Table 5-2 describes each key.
Table 5-2 Charging Manager Keys
| Key | Path in values.yaml | Description |
|---|---|---|
|
enabled |
nchfConvergedCharging |
Whether the CHF pod is enabled. The default is true. |
|
imageRepository |
nchfConvergedCharging |
Specifies the registry server where you pushed images, typically in this format: RepoHost:RepoPort. Note: The composable service uses the global imageRepository setting by default. Set this key only if you want to use a different registry server. |
|
imagePullSecrets |
nchfConvergedCharging |
Specifies the name of the Secret that contains credentials for accessing images from your private image server. Note: The composable service uses the global imagePullSecrets setting by default. Set this key only if you want to use a different Secret. |
|
imagePullPolicy |
nchfConvergedCharging |
Sets when Kubernetes pulls images: Always, IfNotPresent, or Never. Note: The composable service uses the global imagePullPolicy setting by default. Set this key only if you want to use a different setting. |
|
partOfLabel |
nchfConvergedCharging |
Sets the value to assign to the composable service's app.kubernetes.io/part-of label. This label identifies the application that the resource belongs to. Note: The composable service uses the global partOfLabel setting by default. Set this key only if you want to use a different setting. |
|
webserver |
nchfConvergedCharging |
The Helidon HTTP server configuration. |
|
nchfConvergedCharging.* |
nchfConvergedCharging |
The details about the CHF.
|
|
mutatorRulesConfigMapOverride |
nchfConvergedCharging.nchfConvergedCharging |
The name of an existing ConfigMap that contains custom mutator rules to use instead of the default rules provided by the chart. Use this setting when you need to supply your own mutator rule configuration, such as environment-specific policies or customized transformation behavior. When this value is set, the deployment references the specified ConfigMap and bypasses the chart-managed default mutator rules ConfigMap. |
|
restServices[].* |
nchfConvergedCharging.nchfConvergedCharging |
The details about the REST services exposed by the CHF pod.
|
|
processors.* (Mediation Processor) |
nchfConvergedCharging.nchfConvergedCharging |
The details about the mediation processor.
|
|
processors.* (NCHF Processor) |
nchfConvergedCharging.nchfConvergedCharging |
The ordered chain of processors executed for the charging request.
|
|
processors.processors.* (transform-nchf-request Sub-processor) |
nchfConvergedCharging.nchfConvergedCharging |
|
|
processors.processors.* (cdrPublisher Sub-processor) |
nchfConvergedCharging.nchfConvergedCharging |
Configure how the processor publishes the processed CHF request to Kafka.
|
|
networkFunction.* |
nchfConvergedCharging.nchfConvergedCharging |
The details for how the service gets its NF profile information for NRF registration.
|
|
terminationGracePeriodSeconds |
nchfConvergedCharging.nchfConvergedCharging |
The amount of time, in seconds, the pod needs to shut down gracefully. The value must be a non-negative integer. A value of 0 specifies to terminate immediately, and a nil value specifies to use the default grace period. The grace period is the duration after which the processes running in the pod are sent a termination signal. The processes are forcibly terminated. Set this value longer than the expected cleanup time for your process. The default is 60. |
|
resources.* |
nchfConvergedCharging.nchfConvergedCharging |
The minimum and maximum amount of memory and CPU that the coordinator can use. See "Setting Up Autoscaling of Pods". |
|
replicas |
nchfConvergedCharging.nchfConvergedCharging |
The desired number of pod replicas. The default is 1. This key is ignored if HPA is enabled. |
|
jvmOpts |
nchfConvergedCharging.nchfConvergedCharging |
The JVM options to use. |
|
restartCount |
nchfConvergedCharging.nchfConvergedCharging |
The number of times the CHF service has been restarted. Increment this value by 1 and run the Helm upgrade command to force a rolling restart of the CHF service. The default is 0. |
|
service.* |
nchfConvergedCharging.nchfConvergedCharging |
The details of the CHF service.
|
|
adminService.* |
nchfConvergedCharging.nchfConvergedCharging |
The details of the admin service.
|
|
logging.* |
nchfConvergedCharging.nchfConvergedCharging |
The logging levels for the Charging Manager composable service. |
|
tracing.* |
nchfConvergedCharging.nchfConvergedCharging |
Specifies how to set up tracing for the CHF composable service. |
|
hpa.* |
nchfConvergedCharging.nchfConvergedCharging |
The minimum and maximum number of pod replicas that can be deployed, the scale-up rules, and the scale-down rules. |
Configuring the Charging Gateway Function to Generate Unrated CDRs
When configured to generate 5G unrated CDRs, the CGF does the following:
-
Consumes unrated events from the CHF-CGF Kafka topic
-
Aggregates the unrated events
-
(Optionally) Performs one or more of the following functions, depending on your configuration:
-
Detects and handles duplicate, missing, and out-of-order events
-
Tracks sequence information, such as processed ISNs, record sequence numbers, and local sequence numbers
-
Performs state handling
-
Cleans up records from the cnDBTier
-
Persists records in the cnDBTier
-
-
Transforms the unrated events into unrated 5G CDRs
-
Publishes the unrated 5G CDRs to the CGF-CDR topic
To configure the CGF to generate unrated 5G CDRs, set the following keys in your override-values.yaml file for the oc-ccs-version Helm chart:
cgf:
enabled: true
imageRepository: *imageRepository
imagePullSecrets: *imagePullSecrets
imagePullPolicy: *imagePullPolicy
partOfLabel: *partOfLabel
webserver: *webserver
chargingGateway:
name: cgf
fullname: "cgf"
leaderElection:
enabled: true
namePrefix: "cgf"
namespace: ""
identity: ""
serviceAccount:
create: true
name: ""
annotations: {}
rbac:
create: true
resourceNames: []
site:
siteName: "site1"
remoteSites: []
failoverMode:
kafkaFailoverStabilizationWindow: "PT0S"
additionalLabels: *additionalLabels
annotations: *annotations
nodeSelector: *nodeSelector
container:
image: *cgfImage
initContainer:
image: *dbClientImage
db:
initializationFailTimeout: 10000
connectionTimeout: 2000
serviceHostname: *db-cgf-serviceHostname
servicePort: 3306
adminCredentialsSecretName: *db-cgf-adminCredentialsSecretName
serviceCredentialsSecretName: *db-cgf-serviceCredentialsSecretName
dbFailoverStabilizationWindow: "PT0S"
siteStatusEndpoints:
- siteName: "site1"
host:
port:
path: "/db-tier/status/cluster/local/realtime"
coordinator:
enabled: true
tasks:
closedCdrRemoval:
enabled: true
cronSchedule: "0 0/5 * * * ?"
config:
ageOfRecord: PT5M
batchSize: 10000
suspectCdrRetry:
enabled: false
cronSchedule: "0 * * * * ? *"
config:
ageOfRecord: PT5M
batchSize: 10000
resources:
memoryRequest: "512Mi"
cpuRequest: "500m"
memoryLimit: "1024Mi"
cpuLimit: "1.0"
jvmOpts: "-XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:InitialRAMPercentage=80 -XX:MaxRAMPercentage=80 -XX:MinRAMPercentage=80 -Dlog4j.configurationFile=/app/config/log4j2.yaml"
restartCount: 0
adminService:
additionalLabels: {}
additionalAnnotations: {}
type: ClusterIP
messaging:
services:
- name: "ProcessSuspectCdr"
type: KAFKA_CLOUDEVENT_CGF_REQUEST
enabled: true
multiSite: *nchf-cdr-multisite
config:
subscribers: []
processors:
- name: cdrPublisher
type: KAFKA_PUBLISHER_PROCESSOR
producerOnly: false
config:
publisher:
name: cgf-cdr
topic:
name: cgf-cdr-topic
numberOfPartitions: 2
replicationFactor: 2
create:
enabled: true
modification:
enabled: true
keyGenerations:
- criteria: $.payload.chargingDataRequest
keyPaths:
- $.payload.chargingDataRequest.subscriberIdentifier
broker:
name: ccs-broker
auth:
enabled: true
tls:
trustStore:
existingSecret: cgf-cluster-ca-cert
passwordKey: ca.password
keyStore:
existingSecret: cgf-user
passwordKey: user.password
bootstrapServers: kafka:9093
extraConfig:
reconnect.backoff.ms: "175"
reconnect.backoff.max.ms: "1000"
worker:
messaging:
services:
- name: "ProcessNchfCdr"
type: KAFKA_CLOUDEVENT_CGF_REQUEST
enabled: true
multiSite: *nchf-cdr-multisite
config:
subscribers:
- name: nchf-chf-cdr
brokerSite: site1
failoverOrder:
- site2
instanceCount: 1
processorRetryPolicy:
retryCount: 3
retryInterval: "PT0.2S"
maxRequeueAttempts: 10
retryTopic:
name: nchf-cgf-cdr-retry
suspendTopic:
name: nchf-cgf-cdr-suspend
topic:
name: *nchfPublisherTopicName
group: cgf-cdr-0
broker: *ccs-broker-consumer-1
processors:
- name: loggingProcessor
producerOnly: true
type: LOGGING_PROCESSOR
config:
logLevel: INFO
atMostSeconds: 5
- name: aggregator
type: AGGREGATOR_PROCESSOR
config:
partialRecordMethod: DEFAULT
- name: cdrPublisher
type: KAFKA_PUBLISHER_PROCESSOR
durability:
enabled: true
processRetryEnabled: true
batchSize: 1000
schedulerFrequencyInSec: 5
delayInSec: 10
producerOnly: false
config:
publisher:
name: cgf-cdr
topic:
name: cgf-cdr-topic
numberOfPartitions: 2
replicationFactor: 2
create:
enabled: true
modification:
enabled: true
keyGenerations:
- criteria: $.payload.chargingDataRequest
keyPaths:
- $.payload.chargingDataRequest.subscriberIdentifier
broker: *ccs-broker-producer-1
resources:
memoryRequest: "512Mi"
cpuRequest: "500m"
memoryLimit: "1024Mi"
cpuLimit: "1.0"
replicas: 1
jvmOpts: "-XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:InitialRAMPercentage=80 -XX:MaxRAMPercentage=80 -XX:MinRAMPercentage=80 -Dlog4j.configurationFile=/app/config/log4j2.yaml"
restartCount: 0
adminService:
additionalLabels: *additionalLabels
additionalAnnotations: *annotations
type: ClusterIP
terminationGracePeriodSeconds: 60
logging:
format:
type: TEXT
pattern: *loggingPattern
rootLevel: INFO
packageLogging:
- name: com.oracle.cagbu
level: INFO
- name: io.helidon
level: INFO
tracing:
enabled: *tracingEnabled
service: charging-gateway
maxQueueSize: 42
flushIntervalMs: 10001
host: *tracingHost
port: *tracingPort
samplerType: ratio
samplerParam: 0.01
samplerManager:
logSpans: true
webServer:
spans:
httpRequest:
contentWrite: false
contentRead: false
hpa:
enabled: true
minReplicas: 1
maxReplicas: 8
metrics:
cpuAverageUtilization: 65
scaleDown:
selectPolicy: Max
stabilizationWindowSeconds: 300
periodSeconds: 180
scaleUp:
selectPolicy: Max
stabilizationWindowSeconds: 5
periodSeconds: 20
grafanaDashboards: *grafanaDashboards
serviceMonitor: *serviceMonitor
prometheusRule:
enabled: false
namespace:
additionalLabels: { }
remoteConsumptionAlert:
enabled: false
window: 2m
forDuration: 0m
severity: warning
retransmissionAlert:
enabled: false
window: 2m
forDuration: 0m
severity: warning
suspendTopicAlert:
enabled: false
window: 2m
forDuration: 0m
severity: warning
highCloudEventBacklogAlert:
enabled: false
processor: "cdrPublisher"
threshold: 100
forDuration: 5m
severity: critical
cloudEventRepositoryMinorAlert:
enabled: false
processor: "cdrPublisher"
threshold: 0
forDuration: 0m
severity: warningTable 5-3 describes each key.
Table 5-3 Charging Gateway Keys
| Key | Path in values.yaml | Description |
|---|---|---|
|
enabled |
cgf |
Specifies whether the charging-gateway pod is enabled. The default is true. |
|
imageRepository |
cgf |
Specifies the registry server where you pushed images, typically in this format: RepoHost:RepoPort. Note: The ECE composable services use the global imageRepository setting by default. Set this key only if you want to use a different registry server. |
|
imagePullSecrets |
cgf |
Specifies the name of the Secret that contains credentials for accessing images from your private image server. Note: The ECE composable services use the global imagePullSecrets setting by default. Set this key only if you want to use a different Secret. |
|
imagePullPolicy |
cgf |
Sets when Kubernetes pulls images: Always, IfNotPresent, or Never. Note: The ECE composable services use the global imagePullPolicy setting by default. Set this key only if you want to use a different setting. |
|
partOfLabel |
cgf |
Sets the value to assign to the ECE composable services' app.kubernetes.io/part-of label. This label identifies the application that the resource belongs to. Note: The ECE composable services use the global partOfLabel setting by default. Set this key only if you want to use a different setting. |
|
webserver |
cgf |
The details for the Helidon HTTP server configuration. |
|
chargingGateway.* |
cgf |
The details about the charging-gateway pod.
|
|
leaderElection.* |
cgf.chargingGateway |
The details for the leader election, which ensures only one instance acts as the leader at a time for certain responsibilities.
|
|
site.* |
cgf.chargingGateway |
The details about the local CGF site.
|
|
additionalLabels |
cgf.chargingGateway |
The additional labels to add to a Kubernetes custom resource definition (CRD). |
|
annotations |
cgf.chargingGateway |
The additional annotations to add to a Kubernetes CRD. |
|
nodeSelector |
cgf.chargingGateway |
The nodes on which to deploy the charging-gateway pod. |
|
container.image |
cgf.chargingGateway |
The name of the CGF image. |
|
initContainer.image |
cgf.chargingGateway |
The name of the Database Client image. |
| db.* |
cgf.chargingGateway |
The details for connecting to the CGF cnDBTier database.
|
|
coordinator.* |
cgf.chargingGateway |
The coordinator can run scheduled tasks on the CDR cnDBTier.
|
|
worker.messaging.* |
cgf.chargingGateway |
The details for the CGF worker messaging service. See "Setting Up the CGF Worker Messaging Service". |
|
worker.resources.* |
cgf.chargingGateway |
The minimum and maximum amount of memory and CPU that the CGF worker can use. See "Setting Up Autoscaling of Pods". |
|
worker.replicas |
cgf.chargingGateway |
The desired number of pod replicas. The default is 1. This key is ignored if HPA is enabled. |
|
worker.jvmOpts |
cgf.chargingGateway |
The JVM options to use. |
|
worker.restartCount |
cgf.chargingGateway |
The number of times the CGF worker service has been restarted. Increment this value by 1 and run the Helm upgrade command to force a rolling restart of the service. The default is 0. |
|
worker.adminService.* |
cgf.chargingGateway |
The details for how the CGF worker exposes an internal admin endpoint:
|
|
terminationGracePeriodSeconds |
cgf.chargingGateway |
The amount of time, in seconds, the pod needs to shut down gracefully. The value must be a non-negative integer. A value of 0 specifies to terminate immediately, and a nil value specifies to use the default grace period. The grace period is the duration after which the processes running in the pod are sent a termination signal. The processes are forcibly terminated. Set this value longer than the expected cleanup time for your process. The default is 60. |
|
logging.* |
cgf.chargingGateway |
The logging levels for the CGF composable services. |
|
tracing.* |
cgf.chargingGateway |
Specifies how to set up tracing for the CGF composable service. |
|
hpa.* |
cgf.chargingGateway |
The minimum and maximum number of pod replicas that can be deployed, the scale-up rules, and the scale-down rules. |
|
grafanaDashboards.* |
cgf |
The Grafana Dashboard settings. If populated, this value overrides the global setting. See "Monitoring ECE Composable Service Processes". |
|
serviceMonitor.* |
cgf |
The details for the Service Monitor. If populated, this value overrides the global setting. See "Monitoring ECE Composable Service Processes". |
|
prometheusRule.* |
cgf |
The alert modes and threshold rules to run with the Prometheus Operator. See "Configuring Alerting Rules and Thresholds". |
Setting Up Coordinator Tasks
The coordinator pod manages scheduled background tasks that operate on the CDR table. These tasks support data cleanup and recovery workflows to ensure data consistency and reliability in distributed deployments. You can configure the coordinator to run one, both, or none of the available scheduled tasks, depending on your system requirements.
-
The closedCdrRemoval task removes CDR records that meet the following conditions:
-
The record is older than a configured duration (ageOfRecord)
-
The record has one of the following statuses:
-
PUBLISHED: Fully published (cdrPublishStatus is set to PUBLISHED in the CDR table)
-
INVALID: Invalidated during ISN merges (cdrState is set to INVALID in the CDR table)
-
SUSPEND: Published with durable retry (cdrPublishStatus is set to SUSPEND in the CDR table)
-
This task does not remove CDRs immediately after publishing. This ensures that duplicate terminate CDRs received after session closure can still be de-duplicated and rejected. Records with the SUSPECT CDR publish status are intentionally preserved to allow proper reconciliation before publication.
-
-
The suspectCdrRetry task handles the reprocessing of incomplete or inconsistent CDRs. It republishes suspect CDRs that are older than a specified amount of time.
In a multisite deployment, when the CGF receives a CDR Terminate event, it performs the following steps:
-
Scans previously processed ISNs from the database
-
Detects gaps in aggregated ISNs
-
Sets the CDR state to CLOSED if gaps are not detected
-
Marks the CDR publish status as SUSPECT if gaps are detected
-
Note:
Both tasks run as cron-scheduled Helidon tasks. Only one coordinator instance should be running at a time. This is enforced by deploying the coordinator as a singleton pod using the Helm chart.
To configure coordinator tasks, define the following structure in your configuration file:
coordinator:
tasks:
scheduledTaskName:
enabled: true
cronSchedule: "0 0/5 * * * ?"
config:
ageOfRecord: PT5M
batchSize: 10000Table 5-4 describes each key.
Table 5-4 Coordinator Task Keys
| Key | Description |
|---|---|
| scheduledTaskName |
The name of the task to configure: closedCdrRemoval or suspectCdrRetry. |
|
enabled |
Whether to enable the task. |
|
cronSchedule |
The frequency at which to automatically run the task. The default value specifies to run every 5 minutes on the hour, every day of the week. |
|
config.ageOfRecord |
The length of time a record has remained in the CDR table in ISO 8601 duration format. After that amount of time, the task performs an action on the record. The default value is PT5M, which means 5 minutes. |
|
config.batchSize |
The maximum number of records processed in a single batch. |
Setting Up the Coordinator Messaging Service
The Coordinator Messaging Service is a CGF composable service that manages the publication and recovery of CDRs outside the primary event-processing pipeline. The service runs within the coordinator pod and complements the worker-based CDR generation workflow.
The coordinator messaging service performs the following functions:
-
Republishes CDRs that were not delivered successfully
-
Supports retry and recovery workflows, such as recovery from transient Kafka failures
-
Acts as a centralized publisher for coordinator-managed CDR workflows
-
Ensures consistent behavior in high availability (HA) deployments
To configure the coordinator messaging service, enable the coordinator pod and configure the required keys under cgf.chargingGateway.coordinator:
Note:
The coordinator topic name for the ProcessSuspectCdr service must match the topic name for the ProcessNchfCdr service.
messaging:
services:
- name: "ProcessSuspectCdr"
type: KAFKA_CLOUDEVENT_CGF_REQUEST
enabled: true
multiSite: *nchf-cdr-multisite
config:
subscribers: [ ]
processors:
- name: cdrPublisher
type: KAFKA_PUBLISHER_PROCESSOR
producerOnly: false
config:
publisher:
name: cgf-cdr
topic:
name: cgf-cdr-topic
numberOfPartitions: 2
replicationFactor: 2
create:
enabled: true
modification:
enabled: true
keyGenerations:
- criteria: $.payload.chargingDataRequest
keyPaths:
- $.payload.chargingDataRequest.subscriberIdentifier
broker:
name: ccs-broker
auth:
enabled: true
tls:
trustStore:
existingSecret: cgf-cluster-ca-cert
passwordKey: ca.password
keyStore:
existingSecret: cgf-user
passwordKey: user.password
bootstrapServers: kafka:9093
extraConfig:
reconnect.backoff.ms: "175"
reconnect.backoff.max.ms: "1000"Table 5-5 describes each key under cgf.chargingGateway.coordinator.
Table 5-5 Coordinator Messaging Service Keys
| Key | Path in values.yaml | Description |
|---|---|---|
|
name |
messaging.services[] |
The name of the coordinator messaging service that publishes suspect CDRs. The default is ProcessSuspectCdr. |
|
type |
messaging.services[] |
The service type that enables the CGF Kafka CloudEvent processing framework for this publishing flow. The default is KAFKA_CLOUDEVENT_CGF_REQUEST. |
|
enabled |
messaging.services[] |
Whether to enable this messaging service. The default is true. |
|
multisite |
messaging.services[] |
The configuration details for multisite processing and failover behavior for the coordinator messaging service. |
|
processors.name |
messaging.services[] |
The name of the processor that publishes the CDR to Kafka. The default is cdrPublisher. |
|
processors.type |
messaging.services[] |
The processor type that sends processed records to an outbound Kafka topic. The default is KAFKA_PUBLISHER_PROCESSOR. |
|
processors.producerOnly |
messaging.services[] |
Whether this processor can participate in the service chain and is not limited to producer-only use. The default is false. |
|
publisher.name |
messaging.services[].processors.config |
The logical name of the Kafka publisher used by this service. The default is cgf-cdr. |
|
topic.name |
messaging.services[].processors.config.publisher |
The name of the outbound Kafka topic that receives the published CDRs. The default is cgf-cdr-topic. Note: The topic name for the ProcessSuspectCdr service must match the topic name for the ProcessNchfCdr service. |
|
topic.numberOfPartitions |
messaging.services[].processors.config.publisher |
The number of partitions to create or use for the outbound topic. The default is 2. |
|
topic.replicationFactor |
messaging.services[].processors.config.publisher |
The replication factor for the outbound Kafka topic. The default is 2. |
|
topic.create.enabled |
messaging.services[].processors.config.publisher |
Whether the processor can automatically create topics if one does not already exist. The default is true. |
|
topic.modification.enabled |
messaging.services[].processors.config.publisher |
Whether to update the topic when the configured topic settings differ from the existing one. The default is true. |
|
keyGenerations[].criteria |
messaging.services[].processors.config.publisher |
The JSONPath expression used to select the source data for message key generation. |
|
keyGenerations[].keyPaths[] |
messaging.services[].processors.config.publisher |
The JSONPath expression that identifies the field used as the Kafka message key. |
|
broker.name |
messaging.services[].processors.config.publisher |
The logical name of the Kafka broker configuration used by the publisher. The default is ccs-broker. |
|
broker.auth.enabled |
messaging.services[].processors.config.publisher |
Whether to enable broker authentication. The default is true. |
|
broker.auth.tls.trustStore.existingSecret |
messaging.services[].processors.config.publisher |
The Kubernetes Secret that contains the Kafka TrustStore certificate. The default is cgf-cluster-ca-cert. |
|
broker.auth.tls.trustStore.passwordKey |
messaging.services[].processors.config.publisher |
The Secret key that stores the TrustStore password. The default is ca.password. |
|
broker.auth.tls.keyStore.existingSecret |
messaging.services[].processors.config.publisher |
The Kubernetes Secret that contains the client certificate and private key. The default is cgf-user. |
|
broker.auth.tls.keyStore.passwordKey |
messaging.services[].processors.config.publisher |
The Secret key that stores the KeyStore password. The default is user.password. |
|
broker.bootstrapServers |
messaging.services[].processors.config.publisher |
The Kafka bootstrap server address used by the publisher. The default is kafka:9093. |
|
broker.extraConfig.reconnect.backoff.ms |
messaging.services[].processors.config.publisher |
The time in milliseconds to wait before retrying a failed Kafka connection attempt. The default is 175. |
|
broker.extraConfig.reconnect.backoff.max.ms |
messaging.services[].processors.config.publisher |
The maximum back-off time in milliseconds for Kafka reconnect retries. The default is 1000. |
Setting Up the CGF Worker Messaging Service
You use the ProcessNchfCdr worker messaging service to consume unrated events from the CHF-CGF Kafka topic and generate 5G unrated CDRs for downstream consumption. It performs the following functions:
-
Processes CloudEvent payloads
-
Applies aggregation logic
-
Detects sequencing and duplicate conditions
-
Publishes the 5G unrated CDRs to the CGF-CDR Kafka topic
Note:
The service supports multisite failover and includes retry and suspend-topic handling for messages that cannot be processed successfully.
By default, the service uses the following processors to perform these tasks, but you can configure the worker messaging service to use additional or different processors:
-
LOGGING_PROCESSOR: Writes request and event details to the application logs to help operators monitor processing activity and troubleshoot issues
-
AGGREGATOR_PROCESSOR: Applies the unrated CDR aggregation logic
-
KAFKA_PUBLISHER_PROCESSOR: Publishes the resulting CDRs to the outbound CGF-CDR Kafka topic
For more information about processors, see "About the ECE Composable Service Processors".
To configure the worker messaging service, set the following keys under cgf.chargingGateway:
worker:
messaging:
services:
- name: "ProcessNchfCdr"
type: KAFKA_CLOUDEVENT_CGF_REQUEST
enabled: true
multiSite: *nchf-cdr-multisite
config:
subscribers:
- name: nchf-chf-cdr
brokerSite: site1
failoverOrder:
- site2
instanceCount: 1
processorRetryPolicy:
retryCount: 3
retryInterval: "PT0.2S"
maxRequeueAttempts: 10
retryTopic:
name: nchf-cgf-cdr-retry
suspendTopic:
name: nchf-cgf-cdr-suspend
topic:
name: *nchfPublisherTopicName
group: cgf-cdr-0
broker: *ccs-broker-consumer-1
processors:
- name: loggingProcessor
producerOnly: true
type: LOGGING_PROCESSOR
config:
logLevel: INFO
atMostSeconds: 5
- name: aggregator
type: AGGREGATOR_PROCESSOR
config:
partialRecordMethod: DEFAULT
- name: cdrPublisher
type: KAFKA_PUBLISHER_PROCESSOR
durability:
enabled: true
processRetryEnabled: true
batchSize: 1000
schedulerFrequencyInSec: 5
delayInSec: 10
producerOnly: false
config:
publisher:
name: cgf-cdr
topic:
name: cgf-cdr-topic
numberOfPartitions: 2
replicationFactor: 2
create:
enabled: true
modification:
enabled: true
keyGenerations:
- criteria: $.payload.chargingDataRequest
keyPaths:
- $.payload.chargingDataRequest.subscriberIdentifier
broker: *ccs-broker-producer-1Table 5-6 describes each key.
Note:
Configure only one subscriber per broker site within a messaging service. In a single-site deployment, configure one subscriber for the local broker site only. In a multisite deployment, configure one subscriber for each participating broker site.
Table 5-6 Worker Messaging Service Keys
| Key | Path in values.yaml | Description |
|---|---|---|
|
services[n].* |
worker.messaging |
The details for the CGF request-processing service for NCHF charging data.
|
|
subscribers[n].* |
worker.messaging.services[n].config |
The details for how the CGF subscribes to and consumes charging requests from Kafka.
|
|
processors[n].* (Logging Processor) |
worker.messaging.services[n] |
The details for the logging processor.
|
|
processors[n].* (Aggregator Processor) |
worker.messaging.services[n] |
The details for the aggregator processor.
|
|
processors[n].* (CDR Publisher Processor) |
worker.messaging.services[n] |
The details for the CDR publisher processor.
|