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:

  1. Ensure you have installed and configured all prerequisite software, such as Kafka Server and Oracle cnDBTier.

    See "Setting Up Prerequisite Software".

  2. Create an override-values.yaml file for the ECE composable services Helm chart.

  3. Configure the mandatory values for generating unrated CDRs for 5G clients.

    See "Configuring Mandatory Values for Generating Unrated CDRs".

  4. 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".

  5. 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".

  6. Do one of the following:

  7. 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:

  • Always: It always pulls an image from the repository.

  • IfNotPresent: It pulls an image only when one does not exist on a node. This is the default.

  • Never: It never pulls the image from the repository.

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.

  • enabled: Whether to deploy nCHF on multiple sites.

  • coordinationId: The correlation key used to tie a request or failover decision together across sites.

  • failoverMode: The CGF multisite failover mode, which is driven by a site-aware Kafka partition assignment strategy, where local-site consumers have highest priority and automatically take ownership of partitions, with remote sites acting as backups.

    • NEXT_SITE: A single designated backup site takes over all processing when the primary site fails.

    • ALL_REMAINING: All available remote sites share the load during a failure. When the failed site recovers, partition ownership automatically shifts back to the local site, restoring the original active-active balance. This is the default.

  • kafkaFailoverStabilizationWindow: The grace period in ISO 8601 duration format. CGF waits after Kafka looks healthy again before switching consumers back and treating the site as stable. It helps prevent flapping during recovery and makes sure broker and topic health, partition assignment, and consumer groups have settled before normal processing resumes. The default value is PT0S, which means there is no waiting period.

  • remoteSites: The name of each remote site.

kafka-brokers.ccs-broker-producer-1

The details for connecting the producer to the Kafka Server:

  • name: The name of the Kafka broker producer. The default is ccs-broker-producer.

  • bootstrapServers: The host name and port pair for the Apache Kafka cluster. The default is kafka:9093.

  • auth.enabled: Whether the Kafka client is configured to use authenticated TLS for its broker connection (true) or not (false). The default is true.

  • auth.tls.truststore.existingSecret: The name of the Kubernetes Secret that contains the Certificate Authority (CA) file. The default is cgf-billing-cluster-ca-cert.

  • auth.tls.truststore.passwordKey: The data key inside the Secret that contains the TrustStore password. The default is ca.password.

  • auth.tls.keystore.existingSecret: The name of the Kubernetes Secret that contains the client identity KeyStore and its password. The default is cgf-billing-user.

  • auth.tls.keystore.passwordKey: The data key inside the Secret that holds the KeyStore password. The default is user.password.

  • extraConfig.reconnect.backoff.ms: The initial wait, in milliseconds, before retrying a connection to a broker after a failure. The default is 100.

  • extraConfig.reconnect.backoff.max.ms: The maximum delay between successive TCP connection attempts to a broker after a connection is lost or fails. The default is 1000 (1 second).

  • extraConfig.max.block.ms: The Kafka client timeout limiting how long a producer or admin client blocks while waiting for resources such as cluster metadata, buffer space, or a connection to the broker. The default is 30000.

  • extraConfig.request.timeout.ms: The amount of time the Kafka client waits for a response to a request before retrying or failing the operation once retries are exhausted. The default is 15000.

  • extraConfig.delivery.timeout.ms: The Kafka producer’s overall upper bound on how long a record can take from send until Kafka reports success or failure. The default is 60000.

kafka-brokers.ccs-broker-consumer-1

The details for connecting the Charging Gateway consumer to the Kafka Server:

  • name: The name of the Kafka broker consumer. The default is ccs-broker-consumer.

  • bootstrapServers: The host name and port pair for the Apache Kafka cluster. The default is kafka:9093.

  • auth.enabled: Whether the Kafka client is configured to use authenticated TLS for its broker connection (true) or not (false). The default is true.

  • auth.tls.truststore.existingSecret: The name of the Kubernetes Secret that contains the Certificate Authority (CA) file. The default is nchf-cluster-ca-cert.

  • auth.tls.truststore.passwordKey: The data key inside the Secret that contains the TrustStore password. The default is ca.password.

  • auth.tls.keystore.existingSecret: The name of the Kubernetes Secret that contains the client identity KeyStore and its password. The default is nchf-user.

  • auth.tls.keystore.passwordKey: The data key inside the Secret that holds the KeyStore password. The default is user.password.

  • extraConfig.auto.offset.reset: Where to start reading the log when a consumer group has not committed an offset for a partition: latest, earliest, or none. The default is latest, which means read only new records.

  • extraConfig.reconnect.backoff.ms: The initial wait, in milliseconds, before retrying a connection to a broker after a failure. The default is 175.

  • extraConfig.reconnect.backoff.max.ms: The maximum delay between successive TCP connection attempts to a broker after a connection is lost or fails. The default is 1000 (1 second).

  • extraConfig.allow.auto.create.topics: Whether the client can trigger automatic creation of a topic on the broker when it references a non-existent topic (true) or not (false). The default is false.

serviceMonitor.*

The details for the Service Monitor:

  • enabled: Whether to enable Kubernetes Service Monitor, which is used to monitor a group of services. The default is false.

  • namespace: The namespace in which the Service Monitor is deployed.

  • additionalLabels: The labels map used when Service Monitor is deployed.

See "Monitoring ECE Composable Service Processes".

grafanaDashboards.*

The details for the Grafana Dashboards:

  • enabled: Whether to enable Grafana Dashboards for Grafana Operator. The default is false.

  • grafanaNamespace: The namespace in which Grafana is deployed.

  • labels.grafana_dashboard: The labels to add to Grafana CRDs. This helps Grafana discover the dashboards. The default is 1.

  • annotations.k8s-sidecar-target-directory: The directory in which the Grafana Dashboards are deployed. The default is /tmp/dashboards/ccs.

See "Monitoring ECE Composable Service Processes".

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: 20
Table 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.

  • name: The name of the pod. This is used to identify the pod in the cluster. The default is nchf-converged-charging.

  • fullname: The full name of the composable service. This name is used in place of the ReleaseName-Name pattern. The default is nchf-converged-charging.

    Note: The full name must be unique across the sites.

  • additionalLabels: The additional labels to add to a Kubernetes custom resource definition (CRD).

  • annotations: The additional annotations to add to a Kubernetes CRD.

  • nodeSelector: The nodes on which to deploy the CHF composable service.

  • container.image: The name of the CHF image.

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.

  • name: The name of the Converged Charging REST service that processes charging requests and generates unrated CDR output. The default is ConvergedCharging.

  • type: Set this to NCHF_CONVERGED_CHARGING. This is the service type for the Converged Charging request flow.

  • config.path: The REST endpoint used to receive charging requests. The default is /nchf-convergedcharging/v3/chargingdata.

  • config.ingressOrigin: The external origin used when constructing absolute response URLs, such as the HTTP Location header. This value should include only the scheme, host, and optional port.

processors.*

(Mediation Processor)

nchfConvergedCharging.nchfConvergedCharging

The details about the mediation processor.

  • name: The name of the processor. For this configuration, mediation-processor identifies the top-level processor used to coordinate the configured processing chain.

  • type: The processor implementation type. COMPOSITE_PROCESSOR indicates that this processor contains and invokes one or more nested processors.

  • processors.name: The name of the nested processor. mutation-processor-standin identifies the default stand-in processor used in the chain.

  • processors.producerOnly: Whether the nested processor is used only on the producer side of the flow. When set to true, the processor is applied only when producing records.

  • processors.type: The implementation type of the nested processor. LOGGING_PROCESSOR indicates that the processor logs activity instead of modifying CDR data.

  • processors.config.logLevel: The logging level used by the logging processor. The default is INFO.

  • processors.config.atMostSeconds: The minimum interval, in seconds, between log messages. This setting limits how frequently the logging processor writes messages. The default is 10.

processors.*

(NCHF Processor)

nchfConvergedCharging.nchfConvergedCharging

The ordered chain of processors executed for the charging request.

  • name: The name of the processor. The default is nchf-processor.

  • type: Set this to NCHF. This processor is the NCHF domain processor that handles converged charging logic.

  • config.subscriberValidator.enabled: Whether to enable subscriber validation for this deployment. The default is false.

  • config.subscriberValidator.config.baseUri: The base URL of the subscriber profile repository service used for subscriber lookups.

  • config.sessionManager.enabled: Whether to enable the session manager integration for this deployment. The default is false.

  • config.sessionManager.config.baseUri: The base URL of the session manager service.

  • config.sessionManager.config.expiryIntervalInSeconds: The session expiration interval, in seconds, used by the session manager integration.

processors.processors.*

(transform-nchf-request Sub-processor)

nchfConvergedCharging.nchfConvergedCharging

  • name: The name of the processor: transform-nchf-request.

  • type: The processor type: MUTATOR_PROCESSOR.

  • config.rules[].source: The list of configured mutation rules. The default is INLINE, which specifies that the mutation rule is defined directly in the configuration file and is applied in place during request processing.

  • config.rules[].rule.ruleName: The name of the rule. The default is onlineSessionIdEnricher.

  • config.rules[].rule.criterion.expression.nchfRequest.criteriaType: The expression language used to evaluate the rule condition for an nCHF request. It tells CHF how to interpret the criterion expression and determine whether the mutation rule should be applied during request processing. The default is MVEL_EXPRESSION.

  • config.rules[].rule.criterion.expression.nchfRequest.expression: The condition that CHF evaluates to determine whether the mutation rule applies to an nCHF request.

  • config.rules[].rule.mutation.expression.associatedSession.mutationType: The transformation type used to modify the associated session data when CHF applies the mutation rule. The default is MVEL_EXPRESSION.

  • config.rules[].rule.mutation.expression.associatedSession.expression: The expression used to modify or enrich the associated session data during request processing.

processors.processors.*

(cdrPublisher Sub-processor)

nchfConvergedCharging.nchfConvergedCharging

Configure how the processor publishes the processed CHF request to Kafka.

  • name: The name of the processor. The default is cdrPublisher.

  • type: Set this to KAFKA_PUBLISHER_PROCESSOR. This processor publishes messages to Kafka.

  • config.publisher.name: The publisher name used to identify the outbound CDR publisher. The default is nchf.

  • config.publisher.topic.name: The name of the Kafka topic where unrated CDRs are published for CGF consumption. The default is nchf-cgf-cdr.

  • config.publisher.topic.numberOfPartitions: The number of partitions to create or use for the topic. The default is 2.

  • config.publisher.topic.replicationFactor: The Kafka replication factor for the topic. The default is 2.

  • config.publisher.topic.create.enabled: Whether to create the Kafka topic automatically if it does not already exist.

  • config.publisher.topic.modification.enabled: Whether to update the Kafka topic configuration if the existing topic does not match the desired settings.

  • config.publisher.keyGenerations[0].criteria: The subscriber identifier as the basis for key generation.

  • config.publisher.keyGenerations[0].keyPaths[0]: The subscriber identifier field as the Kafka key, which helps keep related CDRs for the same subscriber grouped consistently.

  • config.publisher.broker: A reference to the Kafka broker configuration used for publishing. The default is *ccs-broker-producer-1.

networkFunction.*

nchfConvergedCharging.nchfConvergedCharging

The details for how the service gets its NF profile information for NRF registration.

  • nfProfile: The NF profile JSON file that contains the network function’s registration metadata, such as its identity, services, endpoints, and capabilities.

  • existingNfProfileConfigMap: The Kubernetes source that contains the NF profile.

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.

  • additionalLabels: The additional labels to add to a Kubernetes custom resource definition (CRD).

  • additionalAnnotations: The additional annotations to add to a Kubernetes CRD.

  • type: How the service is exposed:

    • NodePort: Builds on ClusterIP and allocates a port on every node that routes to ClusterIP.
    • ClusterIP: Allocates a cluster-internal IP address for load balancing to endpoints. This is the default.

adminService.*

nchfConvergedCharging.nchfConvergedCharging

The details of the admin service.

  • additionalLabels: The additional labels to add to a Kubernetes custom resource definition (CRD).

  • additionalAnnotations: The additional annotations to add to Kubernetes CRD.

  • type: How the admin service is exposed:

    • NodePort: Builds on ClusterIP and allocates a port on every node that routes to ClusterIP.
    • ClusterIP: Allocates a cluster-internal IP address for load balancing to endpoints. This is the default.

logging.*

nchfConvergedCharging.nchfConvergedCharging

The logging levels for the Charging Manager composable service.

See "Using Logging for ECE Composable Services".

tracing.*

nchfConvergedCharging.nchfConvergedCharging

Specifies how to set up tracing for the CHF composable service.

See "Tracing the Flow of API Calls".

hpa.*

nchfConvergedCharging.nchfConvergedCharging

The minimum and maximum number of pod replicas that can be deployed, the scale-up rules, and the scale-down rules.

See "Setting Up Autoscaling of Pods".

Configuring the Charging Gateway Function to Generate Unrated CDRs

When configured to generate 5G unrated CDRs, the CGF does the following:

  1. Consumes unrated events from the CHF-CGF Kafka topic

  2. Aggregates the unrated events

  3. (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

  4. Transforms the unrated events into unrated 5G CDRs

  5. 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: warning

Table 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.

  • name: The name of the ECE composable services. This is used to identify the ECE composable services in the cluster. The default is cgf.

  • fullname: The full name of the ECE composable services. This name will be used in place of the ReleaseName-Name pattern. The default is cgf.

    Note: The full name must be unique across the sites.

leaderElection.*

cgf.chargingGateway

The details for the leader election, which ensures only one instance acts as the leader at a time for certain responsibilities.

  • enabled: Whether the charging-gateway pod uses Kubernetes leader election to coordinate exclusive responsibilities across multiple pod replicas. When set to true, only one pod performs leader-only operations, such as running scheduled coordinator tasks or managing shared resources, while other pods remain standby for failover. This prevents duplicate execution and ensures consistent behavior in HA deployments. The default is true.

  • namePrefix: The prefix used when creating leader-election Lease names for CGF-managed ECE composable services. The default is cgf.

  • namespace: The namespace where leader-election Lease objects are created. Leave it blank to use the release namespace.

  • identity: The explicit leader-election identity for the pod. If left blank, the application uses the host name.

  • serviceAccount.create: Create a dedicated Kubernetes ServiceAccount for leader-election and related CGF permissions. The default is true.

  • serviceAccount.name: The existing ServiceAccount name to use instead of creating a new one.

  • serviceAccount.annotations: The annotations to apply to the ServiceAccount.

  • rbac.create: Create the RBAC resources needed for CGF to access and update leader-election Lease objects. The default is true.

  • rbac.resourceNames: The fixed Lease resource names to scope RBAC permissions more tightly.

site.*

cgf.chargingGateway

The details about the local CGF site.

  • siteName: The name of the local CGF site. Used as the site identity for multisite routing, ownership, and failover behavior.

  • remoteSites: The list of other site names that this deployment can fail over to or coordinate with in a multisite topology.

  • failoverMode: The failover mode. This controls how Kafka consumption and publishing behave during multisite failover, such as whether only the preferred site is active or whether remaining healthy sites can share work.

  • kafkaFailoverStabilizationWindow: The time to wait after a Kafka site change before switching traffic or rebalancing. This helps avoid churn during brief connectivity flaps.

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.

  • initializationFailTimeout: The initial wait before retrying a connection to the cnDBTier database after a failure. The default is 10000.

  • connectionTimeout: The maximum delay between successive connection attempts to the cnDBTier database after a connection is lost. The default is 2000.

  • serviceHostname: The host name for the CGF database service. If set, this value overrides the global setting.

  • servicePort: The port number for the database service. The default is 3306.

  • adminCredentialsSecretName: The name of the Kubernetes Secret that holds the database administrator credentials used by the CGF database. If populated, this value overrides the global setting.

  • serviceCredentialsSecretName: The name of the Kubernetes Secret that holds the CGF service user credentials used at runtime to connect to the CGF database. If populated, this value overrides the global setting.

  • dbFailoverStabilizationWindow: The time to wait after a database failover event before resuming normal database access, to help avoid brief failover flaps. The default is PT0S.

  • siteStatusEndpoints[n].siteName: The name of the site whose cnDBTier status endpoint is being configured. The default is site1.

  • siteStatusEndpoints[n].host: The host name or IP address of the site for cnDBTier status checks.

  • siteStatusEndpoints[n].port: The port used to reach the cnDBTier for status checks.

  • siteStatusEndpoints[n].path: The HTTP path for the cnDBTier real-time cluster status endpoint used to check local cluster health and availability. The default is /db-tier/status/cluster/local/realtime.

coordinator.*

cgf.chargingGateway

The coordinator can run scheduled tasks on the CDR cnDBTier.

  • enabled: Whether the coordinator pod is enabled. The default is true.

  • tasks.*: The details about the tasks to run, which include the ability to purge old CDR records and to republish old suspect CDRs. See "Setting Up Coordinator Tasks".

  • resources.*: The minimum and maximum amount of memory and CPU that the coordinator can use. See "Setting Up Autoscaling of Pods".

  • jvmOpts: The JVM options to use when starting the coordinator tasks.
  • restartCount: The number of times the coordinator 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.

  • adminService.*: Exposes the coordinator pod’s internal admin endpoints for health, metrics, and operational checks using an internal Kubernetes Service.

  • messaging.*: The details that the coordinator uses to publish messages to a Kafka topic. See "Setting Up the Coordinator Messaging Service".

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:

  • additionalLabels: The additional labels to add to a Kubernetes custom resource definition (CRD).

  • additionalAnnotations: The additional annotations to add to a Kubernetes CRD.

  • type: How the admin service is exposed:

    • NodePort: Builds on ClusterIP and allocates a port on every node that routes to ClusterIP.

    • ClusterIP: Allocates a cluster-internal IP address for load balancing to endpoints. This is the default.

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.

See "Using Logging for ECE Composable Services".

tracing.*

cgf.chargingGateway

Specifies how to set up tracing for the CGF composable service.

See "Tracing the Flow of API Calls".

hpa.*

cgf.chargingGateway

The minimum and maximum number of pod replicas that can be deployed, the scale-up rules, and the scale-down rules.

See "Setting Up Autoscaling of Pods".

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:

    1. Scans previously processed ISNs from the database

    2. Detects gaps in aggregated ISNs

    3. Sets the CDR state to CLOSED if gaps are not detected

    4. 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: 10000

Table 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-1

Table 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.

  • name: The name of the worker messaging service that processes unrated 5G charging events. The default is ProcessNchfCdr.

  • type: The messaging service type used for Kafka-based CloudEvent CGF request processing. The default is KAFKA_CLOUDEVENT_CGF_REQUEST.

  • enabled: Whether to enable the worker messaging service. The default is true.

  • multiSite: The configuration details for multisite processing and failover behavior for the worker messaging service.

subscribers[n].*

worker.messaging.services[n].config

The details for how the CGF subscribes to and consumes charging requests from Kafka.

  • name: The name of the Kafka subscriber configuration. The default is nchf-chf-cdr.

    Note: Each subscriber name must be unique within a site and across all sites so CGF can identify subscriber configurations correctly.

  • brokerSite: The preferred site that actively consumes messages for this subscriber. The default is site1.

  • failoverOrder: The ordered list of remote sites that can take over message consumption during failover conditions.

  • instanceCount: The number of Kafka consumer instances created for this subscriber. The default is 1.

  • processorRetryPolicy.retryCount: The number of retry attempts for failed message processing operations. The default is 3.

  • processorRetryPolicy.retryInterval: The interval between retry attempts. The default is PT0.2S.

  • processorRetryPolicy.maxRequeueAttempts: The maximum number of times a failed message can be requeued before suspension. The default is 10.

  • processorRetryPolicy.retryTopic.name: The name of the Kafka topic used for retrying failed message processing operations. The default is nchf-cgf-cdr-retry.

  • processorRetryPolicy.suspendTopic.name: The name of the Kafka topic used for suspended messages that cannot be processed successfully. The default is nchf-cgf-cdr-suspend.

  • topic.name: The name of the CHF-CGF Kafka topic from which the service consumes unrated events.

    Note: The topic name for the ProcessNchfCdr service must match the topic name for the ProcessSuspectCdr service.

  • group: The Kafka consumer group name used by the subscriber. The default is cgf-cdr-0.

  • broker: The Kafka broker configuration used by the subscriber to consume messages.

processors[n].*

(Logging Processor)

worker.messaging.services[n]

The details for the logging processor.

  • name: The name of the processor in the processing chain. The default for the logging processor is loggingProcessor.

  • producerOnly: Whether the processor is restricted to producer-only behavior. The default for the logging processor is true.

  • type: The processor type used in the processing pipeline. The default for the logging process is LOGGING_PROCESSOR.

  • config.logLevel: The logging level used by the logging processor. The default is INFO.

  • config.atMostSeconds: The maximum interval, in seconds, between log messages generated by the logging processor. The default is 5.

processors[n].*

(Aggregator Processor)

worker.messaging.services[n]

The details for the aggregator processor.

  • name: The name of the processor in the processing chain. The default for the aggregator processor is aggregator.

  • type: The processor type used in the aggregator pipeline. The default for the aggregator processor is AGGREGATOR_PROCESSOR.

  • config.partialRecordMethod: The aggregation mode used for unrated CDR processing:

    • DEFAULT: The CGF aggregates charging requests that belong to the same session and generates aggregated CDRs. This is the default.

    • INDIVIDUAL: The CGF does not aggregate charging requests. The CDR for each operation type in a given session is published immediately after completion of the aggregator processor.

processors[n].*

(CDR Publisher Processor)

worker.messaging.services[n]

The details for the CDR publisher processor.

  • name: The name of the processor in the processing chain. The default for the CDR publishing processor is cdrPublisher.

  • type: The processor type used in the CDR publishing pipeline. The default for the CDR publishing processor is KAFKA_PUBLISHER_PROCESSOR.

  • durability.enabled: Whether to enable durable retry persistence for failed Kafka publish operations. The default is true.

  • durability.processRetryEnabled: Whether to enable retry processing for durable publisher failures. The default is true.

  • durability.batchSize: The number of retry records processed in each retry batch. The default is 1000.

  • durability.schedulerFrequencyInSec: The interval, in seconds, at which the retry scheduler runs. The default is 5.

  • durability.delayInSec: The delay, in seconds, before retry processing begins for failed publish operations. The default is 10.

  • producerOnly: Whether the processor is restricted to producer-only behavior. The default is false.

  • config.publisher.name: The logical name of the Kafka publisher. The default is cgf-cdr.

  • publisher.topic.name: The name of the outbound Kafka topic used to publish CDRs. The default is cgf-cdr-topic.

  • publisher.topic.numberOfPartitions: The number of Kafka partitions for the outbound topic. The default is 2.

  • publisher.topic.replicationFactor: The Kafka replication factor for the outbound topic. The default is 2.

  • publisher.topic.create.enabled: Whether to enable automatic creation of the outbound Kafka topic. The default is true.

  • publisher.topic.modification.enabled: Whether to enable automatic modification of existing Kafka topic settings. The default is true.

  • publisher.keyGenerations[n].criteria: The JSONPath criteria used to determine when message key generation applies. The default is $.payload.chargingDataRequest.

  • publisher.keyGenerations[n].keyPaths[n]: The JSONPath expression used to generate the Kafka message key. The default is $.payload.chargingDataRequest.subscriberIdentifier.

  • publisher.broker: The Kafka broker configuration used to publish outbound CDRs.