6 Integrating ECE CHF Composable Service with ECE for 5G Charging

You can integrate the Oracle Communications Elastic Charging Engine (ECE) Charging Manager (CHF) composable service with your existing ECE cloud native deployment to perform 5G charging.

Topics in this document:

About Integrating the ECE CHF Composable Service into ECE for 5G Charging

When the ECE Charging Manager (CHF) composable service is integrated with an existing ECE deployment, the composable services work together to provide real-time 5G charging, quota management, spending limit control, and charging notification processing for 5G services.

The CHF provides the public 3GPP Nchf service interfaces used by 5G network functions, such as the Session Management Function (SMF) and Policy Control Function (PCF). The CHF acts as the network-facing charging gateway and mediation layer between the 5G core network and ECE.

The ECE Elastic Charging Server (ECS) acts as the primary charging engine and is responsible for subscriber charging sessions, balance reservation and consumption, real-time rating, policy evaluation, and spending limit enforcement. ECS also generates rated charging events and charging-related notifications as part of the charging workflow.

This architecture enables scalable, cloud native 5G charging while separating the network-facing charging interfaces provided by the CHF from the real-time charging, balance management, and policy processing capabilities provided by ECS.

ECE and the CHF work together to generate 5G unrated and rated CDRs through the following workflow:

  1. The CHF converts the request into an unrated event and sends it to the CHF-CGF Kafka topic. The Charging Gateway Function (CGF) consumes the unrated event from the Kafka topic and generates unrated 5G call detail records (CDRs).

    Note:

    The CHF always sends unrated events to the CGF to generate unrated 5G CDRs, even when the charging request is quota managed and also requires rating. This behavior supports 3GPP charging and charging-record generation requirements.

  2. The CHF determines whether a request requires online charging processing by checking for quota-management information, such as requested units or online-charging indicators.

  3. If the request requires online charging, the CHF forwards the request to the ECE HTTP Gateway.

    For active online charging sessions, the CHF also routes session termination requests to the HTTP Gateway, even when quota-related information is no longer present in the request. This behavior helps prevent orphaned sessions and ensures the proper release of reserved resources.

  4. The HTTP Gateway forwards charging requests to ECS for rating and charging processing.

  5. ECS generates rated events and charging-related notifications as part of the charging workflow.

  6. ECS delivers charging and spending limit notifications asynchronously through Kafka-based notification distribution.

  7. The HTTP Gateway consumes the notification events from Kafka and delivers notifications to external network functions by using the notification URIs associated with the charging or spending-limit sessions.

High-Level Configuration Tasks to Use CHF for 5G Charging

To configure the ECE CHF composable service and your existing ECE cloud native deployment for 5G charging:

  1. Ensure you have installed and configured all prerequisite software, such as Kafka server.

    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 rating 5G events.

    See "Configuring Mandatory Values for 5G Charging".

  4. Configure the CHF composable service to process charging and SLC requests and route them appropriately.

    See "Configuring the CHF Composable Service for 5G Charging".

  5. Configure the NRF Management Agent to register the CHF with the 5G NRF.

    See "Configuring the NRF Management Agent".

  6. Migrate the CHF and CGF composable services into your existing ECE deployment.

    See "Migrating the CHF and CGF Composable Services into an Existing ECE System".

Configuring Mandatory Values for 5G Charging

To configure the ECE composable services to perform real-time charging, quota management, and spending limit control for 5G services, 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 different Service Monitor settings for the NRF Management Agent, set the keys under nchfConvergedCharging.nchfConvergedCharging.nrfManagementAgent.serviceMonitor.

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 { }

webserverDefaults: &webserver
  maxPayloadSize: 2000000

nrfManagementImage: &nrfManagementImage "ccs/nrf-management:15.2.0.0.2"
nchfConvergedChargingImage: &nchfConvergedChargingImage "ccs/chf/nchf-converged-charging:15.2.0.0.2"

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 6-1 describes each key.

Table 6-1 Mandatory Keys for 5G Charging

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 image pull secret or list of image pull secrets used by pods to authenticate to the private image registry.

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

A key-value map of additional Kubernetes labels applied to deployed resources.

annotations

A key-value map of Kubernetes annotations applied to deployed resources.

webserverDefaults.maxPayloadSize

The maximum allowed size of an HTTP request body.

The default is 2000000.

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.

tracingEnabled

Whether tracing through Jaeger is enabled.

The default is false.

tracingHost

The host name for the Jaeger server.

The default is otlp-collector-host.

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 CHF on multiple sites.

  • enabled: Whether to deploy CHF on multiple sites.

  • coordinationId: The correlation key used to tie a request or failover decision together across sites. The default is nchf-cdr-coordination.

  • failoverMode: The CHF 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. CHF 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 list of remote site names. The default is site2 and site3.

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 Kafka consumer configuration used by the CGF to consume unrated events from CHF.

  • 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 cgf-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 it reads 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 nonexistent 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 CHF Composable Service for 5G Charging

When configured for 5G charging, the CHF performs these functions:

  • Exposes the 5G Nchf service interfaces for:

    • Converged charging (nchf-convergedcharging)

    • Spending limit control (nchf-spendinglimitcontrol)

  • Processes charging requests originating from SMF and other network functions

  • Processes spending limit control subscription and policy requests originating from PCF

  • Mediates and transforms incoming requests and outgoing responses

  • Routes online charging requests to the ECS for rating, quota reservation and consumption, session lifecycle management, balance management, and spending limit enforcement

To configure the CHF pod to process 5G charging requests, 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: *nchfPublisherTopicName
                      numberOfPartitions: 2
                      replicationFactor: 2
                      create:
                        enabled: true
                      modification:
                        enabled: true
                    keyGenerations:
                      - criteria: $.subscriberIdentifier
                        keyPaths:
                          - $.subscriberIdentifier
                    broker: *ccs-broker-producer-1
              - name: rest-nchf-httpgw
                type: NCHF_REST_PROCESSOR
                config:
                  host: "httpgw"
                  port: "8080"
                faultTolerance:
                  retry:
                    delay: 100
                    calls: 3
                    delayFactor: 1.0
                  circuitBreaker:
                    delay: 200
                    errorRatio: 30
                    successThreshold: 2
                    volume: 10
                criteria:
                  criterion:
                    expression:
                      nchfRequest:
                        criteriaType: MVEL_EXPRESSION
                        expression: "(value.associatedSession.id != null && value.associatedSession.id.startsWith('online_')) || value.isOnlineChargingRequest()"
      - name: "SpendingLimitControl"
        type: NCHF_SPENDING_LIMIT_CONTROL
        config:
          path: "/nchf-spendinglimitcontrol/v1/subscriptions"
        processors:
          - name: slc-logger
            producerOnly: true
            type: LOGGING_PROCESSOR
            config:
              logLevel: INFO
              atMostSeconds: 10
          - name: rest-slc-httpgw
            type: REST_PROCESSOR
            config:
              uri: "http://httpgw:8080/nchf-spendinglimitcontrol/v1/subscriptions"
            faultTolerance:
              retry:
                delay: 100
                calls: 3
                delayFactor: 1.0
              circuitBreaker:
                delay: 200
                errorRatio: 30
                successThreshold: 2
                volume: 10

    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

  grafanaDashboards: *grafanaDashboards
  serviceMonitor: *serviceMonitor

  ingress:
    ingressClassName:

Table 6-2 describes each key.

Table 6-2 Charging Manager Keys

Key Path in values.yaml Description

enabled

nchfConvergedCharging

Whether the CHF converged charging service is enabled. The default is true.

imageRepository

nchfConvergedCharging

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

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

The Kubernetes image pull policy for CHF pods: 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 Kubernetes resource name prefix for 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

The path to a different ConfigMap for mutation rules. This lets you override the standard transformation rules used by the mutation processor. For example, you could use it to:

  • Adjust request mapping for a particular environment

  • Change how online charging requests are enriched

  • Update mutation logic without rebuilding the service

restServices[0].*

(Converged Charging Service)

nchfConvergedCharging.nchfConvergedCharging

The details about the Converged Charging Service.

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

  • 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.*: This is the list of processors to run in the Converged Charging Service. See "Configuring Processors for the Converged Charging Service".

restServices[0].*

(Spending Limit Control Service)

nchfConvergedCharging.nchfConvergedCharging

The details about the Spending Limit Control Service.

  • name: The name of the SLC REST service. The default is SpendingLimitControl.

  • type: Set this to NCHF_SPENDING_LIMIT_CONTROL. This is the service type for the SLC request flow.

  • config.path: The REST endpoint used to receive SLC requests. The default is /nchf-spendinglimitcontrol/v1/subscriptions.

  • processors.*: The details for the SLC Service. See "Configuring Processors for the Spending Limit Control Service".

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 CHF composable service 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 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.

logging.*

nchfConvergedCharging.nchfConvergedCharging

The logging levels for the CHF 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".

grafanaDashboards.*

nchfConvergedCharging.nchfConvergedCharging

The details for the CHF Grafana Dashboards.

See "Monitoring ECE Composable Service Processes".

serviceMonitor.*

nchfConvergedCharging.nchfConvergedCharging

The details for the CHF Service Monitor.

See "Monitoring ECE Composable Service Processes".

ingress.ingressClassName

nchfConvergedCharging.nchfConvergedCharging

The Kubernetes Ingress class used for the CHF deployment when ingress is enabled. It determines which ingress controller manages external access to the CHF service.

nrfManagementAgent

nchfConvergedCharging.nchfConvergedCharging

The details for the NRF Management Agent.

See "Configuring the NRF Management Agent".

Configuring Processors for the Converged Charging Service

The Converged Charging service provides the 5G Nchf converged charging interface, which is used by network functions to submit charging requests to the CHF. This service processes charging data requests, evaluates whether online charging is required, publishes usage events for unrated CDR generation, and routes eligible requests to ECS for rating and quota management.

The Converged Charging service exposes the standard 3GPP Nchf charging endpoint and uses a configurable processor framework to perform request mediation, transformation, Kafka publication, and ECE integration.

By default, the Converged Charging service processes requests by running the following processors in sequence:

  1. mediation-processor: Performs preliminary mediation and optional logging behavior before charging orchestration begins.

  2. nchf-processor: Runs CHF-specific charging orchestration and downstream request handling. By default, it also calls the following sub-processors:

    1. transform-nchf-request: Applies request transformation and session enrichment logic.

    2. cdrPublisher: Publishes usage events to Kafka for unrated 5G CDR generation.

    3. rest-nchf-httpgw: Routes eligible online charging requests to HTTP Gateway and ECE.

For more information about processors, see "About the ECE Composable Service Processors".

Table 6-3 lists the keys for configuring the nchf-processor.

Table 6-3 Converged Charging Service Keys

Key Path in values.yaml Description

name

restServices.processors

The name of the service: ConvergedCharging.

type

restServices.processors

The service type: NCHF_CONVERGED_CHARGING.

processors[].*

(mediation-processor)

restServices.processors

This processor performs preliminary mediation and optional logging.

  • name: The logical name of the processor: mutation-processor-standin.

  • producerOnly: Whether the processor is used only for producing log output. The default is true.

  • type: The processor type: COMPOSITE_PROCESSOR.

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

  • config.atMostSeconds: The maximum frequency for repeated log messages.

processors[].*

(nchf-processor)

restServices.processors

This processor forwards requests to HTTP Gateway and ECS.

  • name: The logical name of the processor: nchf-processor.

  • type: The processor type: NCHF.

  • config.subscriberValidator.enabled: Whether optional subscriber validation is enabled. The default is false.

  • config.subscriberValidator.config.baseUri: The base URL of the subscriber profile repository service. The default is http://subscriber-profile-repository:8080/subscriberProfileRepository/v1.

  • config.sessionManager.enabled: Whether session manager integration is enabled. The default is false.

  • config.sessionManager.config.baseUri: The base URL of the session manager service. The default is http://session-manager:8080/sessionManager/v1.

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

  • processors: The list of sub-processors to run in the specified order. The nchf-processor can run one or more of these sub-processors:

    • transform-nchf-request: Applies request transformation and session enrichment logic. See "Table 6-4".

    • cdrPublisher: Publishes usage events to Kafka for unrated 5G CDR generation. See "Table 6-5".

    • rest-nchf-httpgw: Routes eligible online charging requests to HTTP Gateway and ECE. See "Table 6-6".

Table 6-4 lists the keys for configuring the transform-nchf-request sub-processor to transform the request and enrich sessions.

Table 6-4 transform-nchf-request Sub-processor Keys

Key Description

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.

Table 6-5 lists the keys for configuring the cdrPublisher sub-processor to publish usage events to Kafka.

Table 6-5 cdrPublisher Sub-processor Keys

Key Description

name

The name of the processor: cdrPublisher.

type

The processor type: KAFKA_PUBLISHER_PROCESSOR.

config.publisher.name

The logical publisher name. The default is nchf.

config.publisher.topic.name

The Kafka topic used for event publication.

config.publisher.topic.numberOfPartitions

The number of Kafka topic partitions. The default is 2.

config.publisher.topic.replicationFactor

The Kafka topic replication factor. The default is 2.

config.publisher.topic.create.enabled

Whether Kafka topic auto-creation is enabled. The default is true.

config.publisher.topic.modification.enabled

Whether Kafka topic modification is enabled. The default is true.

config.publisher.keyGenerations

The key-generation rules used for Kafka message partitioning.

config.publisher.broker

The Kafka broker configuration used by the publisher.

Table 6-6 lists the keys for configuring the rest-nchf-httpgw sub-processor to route online charging requests to HTTP Gateway and ECS.

Table 6-6 rest-nchf-httpgw Sub-processor Keys

Key Description

name

The name of the processor: rest-nchf-httpgw.

type

The processor type: NCHF_REST_PROCESSOR.

config.host

The target HTTP Gateway host name. The default is httpgw.

config.port

The target HTTP Gateway port. The default is 8080.

faultTolerance.retry.delay

The initial retry delay in milliseconds. The default is 100.

faultTolerance.retry.calls

The maximum number of retry attempts. The default is 3.

faultTolerance.retry.delayFactor

The retry backoff factor. The default is 1.0.

faultTolerance.circuitBreaker.delay

The delay before circuit-breaker retry attempts. The default is 200.

faultTolerance.circuitBreaker.errorRatio

The error ratio threshold used to open the circuit breaker. The default is 30.

faultTolerance.circuitBreaker.successThreshold

The number of successful calls required to close the circuit breaker. The default is 2.

faultTolerance.circuitBreaker.volume

The sliding window size used by the circuit breaker. The default is 10.

criteria.criterion.expression.nchfRequest.criteriaType

The expression used to determine whether the request is routed to ECE for online charging. The default is MVEL_EXPRESSION.

criteria.criterion.expression.nchfRequest.expression

The condition CHF evaluates to determine whether the request matches the criteria and should be routed to the associated processor.

Configuring Processors for the Spending Limit Control Service

The Spending Limit Control (SLC) service provides the 5G Nchf spending limit control interface, which is used by network functions to manage subscriber spending limit subscriptions and policy notifications. This service receives spending limit control requests, applies optional mediation and logging behavior, and forwards the requests to HTTP Gateway and ECS for spending limit processing and policy enforcement.

The SLC service exposes the standard 3GPP Nchf spending limit control REST endpoint and uses a configurable processor framework to perform request logging, fault-tolerant forwarding, and ECS integration.

By default, the SLC service processes requests by running the following processors in sequence:

  1. slc-logger: Performs optional request logging for operational visibility and troubleshooting.

  2. rest-slc-httpgw: Routes spending limit control requests to HTTP Gateway and ECS for spending limit processing.

For more information about processors, see "About the ECE Composable Service Processors".

Table 6-7 lists the keys for configuring the SLC service processors.

Table 6-7 SLC Service Keys

Key Path in values.yaml Description

name

restServices.processors

The logical name of the spending limit control service: SpendingLimitControl.

type

restServices.processors

The service type identifier for the Nchf spending limit control interface: NCHF_SPENDING_LIMIT_CONTROL.

config.path

restServices.processors

The REST endpoint used to receive SLC requests. The default is /nchf-spendinglimitcontrol/v1/subscriptions.

processors[].*

(slc-logger)

restServices.processors

This processor performs preliminary mediation and optional logging.

  • name: The logical name of the processor: slc-logger.

  • producerOnly: Whether the processor is used only for producing log output. The default is true.

  • type: The logging processor type: LOGGING_PROCESSOR.

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

  • config.atMostSeconds: The maximum frequency for repeated log messages. The default is 10.

processors[].*

(rest-slc-httpgw)

restServices.processors

This processor runs CHF-specific charging orchestration and downstream request handling.

  • name: The logical name of the processor: rest-slc-httpgw.

  • type: The processor type: REST_PROCESSOR.

  • config.uri: The target URI used to forward spending limit control requests to HTTP Gateway. The default is http://httpgw:8080/nchf-spendinglimitcontrol/v1/subscriptions.

  • faultTolerance.retry.delay: The initial retry delay in milliseconds. The default is 100.

  • faultTolerance.retry.calls: The maximum number of retry attempts. The default is 3.

  • faultTolerance.retry.delayFactor: The retry backoff factor. The default is 1.0.

  • faultTolerance.circuitBreaker.delay: The delay before circuit-breaker retry attempts. The default is 200.

  • faultTolerance.circuitBreaker.errorRatio: The error ratio threshold used to open the circuit breaker. The default is 30.

  • faultTolerance.circuitBreaker.successThreshold: The number of successful calls required to close the circuit breaker. The default is 2.

  • faultTolerance.circuitBreaker.volume: The sliding window size used by the circuit breaker. The default is 10.

Configuring the NRF Management Agent

The NRF Management Agent manages the registration and lifecycle of the CHF with the 5G NRF. It publishes the CHF network function profile and exposes Nchf services so that 5G core network functions can discover and access the services dynamically. The agent continuously monitors CHF health and updates NRF registration status based on service availability and readiness. It also provides secure communication with the NRF by using configured OAuth 2.0 authentication and TLS settings.

In multisite deployments, the NRF Management Agent supports resilient connectivity and automatic failover across redundant NRF endpoints.

To configure the NRF Management Agent, set the following keys in your override-values.yaml file:

nrfManagementAgent:
  enabled: true
  imageRepository: *imageRepository
  imagePullSecrets: *imagePullSecrets
  imagePullPolicy: *imagePullPolicy
  partOfLabel: *partOfLabel
  nrfManagement:
    fullname: nchf-nrf
    additionalLabels: *additionalLabels
    annotations: *annotations
    nodeSelector: *nodeSelector
    container:
      image: *nrfManagementImage
    existingNfProfileConfigMap: *existingNfProfileConfigMap
    nrfConfig:
      nrfClientInstanceName: nchf-nrf
      profileFile: *profileFile
      nfService:
        health:
          enabled: true
          endpoint: http://nchf-converged-charging-admin:8081/health/ready
          timeout: PT5S
          cacheTimeout: PT30S
          defaultCapacity: 100
          suspendOnFailure: true
      tlsProfiles:
        tls1: &tls
          enabled: true
          hostnameVerification: true
          secretName: "nrf-tls-client-creds"
          mtls:
            enabled: true
      authProfiles:
        nrfOauth: &nrfOauth
          type: OAUTH2
          oauth2:
            secretName: "nrf-oauth2-credentials"
            identityUri: ""
            tokenUri: "https://keycloak.svc.cluster.local:8443/realms/nrf-realm/protocol/openid-connect/token"
            scopes:
              - nnrf-nfm
            tokenTls: *tls
      apiEndpoints:
        - name: NrfSite1
          heartBeatInterval: 5
          primary:
            name: ad1-pri
            uri: https://nrf-1:8443/
            authentication: *nrfOauth
            tls: *tls
          fallbacks:
            - name: ad2
              uri: https://nrf-2:8443/
              authentication: *nrfOauth
              tls: *tls
            - name: ad3
              uri: https://nrf-3:8443/
              authentication: *nrfOauth
              tls: *tls
  grafanaDashboards: *grafanaDashboards
  serviceMonitor: *serviceMonitor

Table 6-8 describes these keys.

Table 6-8 Keys for the NRF Management Agent

Key Path to values.yaml Description

enabled

nchfConvergedCharging.nrfManagementAgent

Whether the NRF Management Agent is enabled. The default is true.

imageRepository

nchfConvergedCharging.nrfManagementAgent

The shared image repository used for the NRF Management Agent images.

imagePullSecrets

nchfConvergedCharging.nrfManagementAgent

The image pull secrets used to retrieve container images.

imagePullPolicy

nchfConvergedCharging.nrfManagementAgent

The image pull policy applied to NRF Management Agent containers.

partOfLabel

nchfConvergedCharging.nrfManagementAgent

The shared Kubernetes part-of label value applied to NRF Management Agent resources.

nrfManagement.*

nchfConvergedCharging.nrfManagementAgent

The NRF management configuration, including:

  • fullname: The full name value used as the NRF management resource name. The default is nchf-nrf.

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

  • additionalLabels: The additional labels applied to NRF management resources.

  • annotations: The annotations applied to NRF management resources.

  • nodeSelector: The node selector used to constrain pod scheduling.

  • container.image: The container configuration, including the NRF management container image.

  • existingNfProfileConfigMap: The existingNfProfileConfigMap value used to reference an existing NF profile ConfigMap.

nrfConfig.*

nchfConvergedCharging.nrfManagementAgent

The nrfConfig configuration.

  • nrfClientInstanceName: The NRF client instance name. The default is nchf-nrf.

  • profileFile: The profile file used for the NRF client configuration.

nfService.health.*

nchfConvergedCharging.nrfManagementAgent.nrfConfig

The health monitoring settings used by the NRF management agent to determine CHF service availability and registration status.

  • enabled: Whether NF service health checks are enabled. The default is true.

  • endpoint: The endpoint used to check NF service readiness. The default is http://nchf-converged-charging-admin:8081/health/ready.

  • timeout: The amount of time to wait before the health check request times out. The default is PT5S.

  • cacheTimeout: The amount of time to cache the health check result. The default is PT30S.

  • defaultCapacity: The default NF service capacity value. The default is 100.

  • suspendOnFailure: Whether the NF service is suspended when the health check fails. The default is true.

tlsProfiles.tls1.*

nchfConvergedCharging.nrfManagementAgent.nrfConfig

The TLS configuration profiles that the NRF Management Agent uses when connecting to NRF API endpoints and related services.

  • enabled: Whether the TLS profile is enabled. The default is true.

  • hostnameVerification: Whether standard HTTPS hostname verification is enabled. The default is true.

  • secretName: The Kubernetes Secret name that contains the NRF TLS client credentials. The default is nrf-tls-client-creds.

  • mtls.enabled: Whether mutual TLS is enabled for the TLS profile. The default is true.

authProfiles.nrfOauth.*

nchfConvergedCharging.nrfManagementAgent.nrfConfig

The OAuth 2.0 authentication profile used by CHF when connecting to NRF.

  • type: The authentication profile type. The default is OAUTH2.

  • oauth2.secretName: The Kubernetes Secret that contains the OAuth 2.0 credentials for this authentication profile. The default is nrf-oauth2-credentials.

  • oauth2.identityUri: The OAuth 2.0 identity URI for this authentication profile.

  • oauth2.tokenUri: The OAuth 2.0 token endpoint URI used to retrieve access tokens. The default is https://keycloak.svc.cluster.local:8443/realms/nrf-realm/protocol/openid-connect/token.

  • oauth2.scopes: The OAuth 2.0 scopes requested for this authentication profile. The default is nnrf-nfm.

  • oauth2.tokenTls: The TLS or mutual TLS profile used for the OAuth 2.0 token endpoint.

apiEndpoints.*

nchfConvergedCharging.nrfManagementAgent.nrfConfig

The NRF endpoint set that CHF uses for NRF communication and failover.

  • name: The name of the NRF API endpoint site. The default is NrfSite1.

  • heartBeatInterval: The heartbeat interval for the NRF API endpoint. The default is 5.

  • primary.name: The name of the primary NRF API endpoint. The default is ad1-pri.

  • primary.uri: The URI of the primary NRF API endpoint. The default is https://nrf-1:8443/.

  • primary.authentication: The authentication profile used for the primary NRF API endpoint.

  • primary.tls: The TLS profile used for the primary NRF API endpoint.

  • fallbacks.name: The name of the fallback NRF API endpoint. The defaults are ad2 and ad3.

  • fallbacks.uri: The URI of the fallback NRF API endpoint. The defaults are https://nrf-2:8443/ and https://nrf-3:8443/.

  • fallbacks.authentication: The authentication profile used for the fallback NRF API endpoint.

  • fallbacks.tls: The TLS profile used for the fallback NRF API endpoint.

grafanaDashboards.*

nchfConvergedCharging.nrfManagementAgent

The Grafana dashboard configuration used for NRF Management Agent observability.

serviceMonitor.*

nchfConvergedCharging.nrfManagementAgent

The ServiceMonitor configuration used to expose NRF Management Agent metrics to Prometheus.