@@ -4,15 +4,12 @@ use snafu::{ResultExt, Snafu};
44use stackable_operator:: {
55 builder:: meta:: ObjectMetaBuilder ,
66 k8s_openapi:: api:: core:: v1:: { Service , ServicePort , ServiceSpec } ,
7- kvp:: { Label , ObjectLabels } ,
7+ kvp:: { Annotations , Labels , ObjectLabels } ,
88 role_utils:: RoleGroupRef ,
99} ;
1010
1111use crate :: crd:: { HTTPS_PORT , HTTPS_PORT_NAME , METRICS_PORT , METRICS_PORT_NAME , v1alpha1} ;
1212
13- const METRICS_SERVICE_SUFFIX : & str = "metrics" ;
14- const HEADLESS_SERVICE_SUFFIX : & str = "headless" ;
15-
1613#[ derive( Snafu , Debug ) ]
1714pub enum Error {
1815 #[ snafu( display( "object is missing metadata to build owner reference" ) ) ]
@@ -24,11 +21,6 @@ pub enum Error {
2421 MetadataBuild {
2522 source : stackable_operator:: builder:: meta:: Error ,
2623 } ,
27-
28- #[ snafu( display( "failed to build Labels" ) ) ]
29- LabelBuild {
30- source : stackable_operator:: kvp:: LabelError ,
31- } ,
3224}
3325
3426/// The rolegroup headless [`Service`] is a service that allows direct access to the instances of a certain rolegroup
@@ -42,9 +34,7 @@ pub fn build_rolegroup_headless_service(
4234 Ok ( Service {
4335 metadata : ObjectMetaBuilder :: new ( )
4436 . name_and_namespace ( nifi)
45- . name ( rolegroup_headless_service_name (
46- & role_group_ref. object_name ( ) ,
47- ) )
37+ . name ( role_group_ref. rolegroup_headless_service_name ( ) )
4838 . ownerreference_from_resource ( nifi, None , Some ( true ) )
4939 . context ( ObjectMissingMetadataForOwnerRefSnafu ) ?
5040 . with_recommended_labels ( object_labels)
@@ -69,23 +59,24 @@ pub fn build_rolegroup_metrics_service(
6959 role_group_ref : & RoleGroupRef < v1alpha1:: NifiCluster > ,
7060 object_labels : ObjectLabels < v1alpha1:: NifiCluster > ,
7161 selector : BTreeMap < String , String > ,
72- ports : Vec < ServicePort > ,
62+ product_version : & str ,
7363) -> Result < Service , Error > {
7464 Ok ( Service {
7565 metadata : ObjectMetaBuilder :: new ( )
7666 . name_and_namespace ( nifi)
77- . name ( rolegroup_metrics_service_name ( role_group_ref. object_name ( ) ) )
67+ . name ( role_group_ref. rolegroup_metrics_service_name ( ) )
7868 . ownerreference_from_resource ( nifi, None , Some ( true ) )
7969 . context ( ObjectMissingMetadataForOwnerRefSnafu ) ?
8070 . with_recommended_labels ( object_labels)
8171 . context ( MetadataBuildSnafu ) ?
82- . with_label ( Label :: try_from ( ( "prometheus.io/scrape" , "true" ) ) . context ( LabelBuildSnafu ) ?)
72+ . with_labels ( prometheus_labels ( ) )
73+ . with_annotations ( prometheus_annotations ( product_version) )
8374 . build ( ) ,
8475 spec : Some ( ServiceSpec {
8576 // Internal communication does not need to be exposed
8677 type_ : Some ( "ClusterIP" . to_string ( ) ) ,
8778 cluster_ip : Some ( "None" . to_string ( ) ) ,
88- ports : Some ( ports ) ,
79+ ports : Some ( vec ! [ metrics_service_port ( product_version ) ] ) ,
8980 selector : Some ( selector) ,
9081 publish_not_ready_addresses : Some ( true ) ,
9182 ..ServiceSpec :: default ( )
@@ -124,13 +115,28 @@ pub fn metrics_service_port(product_version: &str) -> ServicePort {
124115 }
125116}
126117
127- /// Returns the metrics rolegroup service name `<cluster>-<role>-<rolegroup>-<METRICS_SERVICE_SUFFIX>`.
128- pub fn rolegroup_metrics_service_name ( role_group_ref_object_name : impl AsRef < str > ) -> String {
129- let role_group_ref_object_name = role_group_ref_object_name. as_ref ( ) ;
130- format ! ( "{role_group_ref_object_name}-{METRICS_SERVICE_SUFFIX}" )
118+ /// Common labels for Prometheus
119+ fn prometheus_labels ( ) -> Labels {
120+ Labels :: try_from ( [ ( "prometheus.io/scrape" , "true" ) ] ) . expect ( "should be a valid label" )
131121}
132122
133- /// Returns the headless rolegroup service name `<cluster>-<role>-<rolegroup>-<HEADLESS_SERVICE_SUFFIX>`.
134- pub fn rolegroup_headless_service_name ( role_group_ref_object_name : & str ) -> String {
135- format ! ( "{role_group_ref_object_name}-{HEADLESS_SERVICE_SUFFIX}" )
123+ /// Common annotations for Prometheus
124+ ///
125+ /// These annotations can be used in a ServiceMonitor.
126+ ///
127+ /// see also <https://github.com/prometheus-community/helm-charts/blob/prometheus-27.32.0/charts/prometheus/values.yaml#L983-L1036>
128+ fn prometheus_annotations ( product_version : & str ) -> Annotations {
129+ let ( path, port, scheme) = if product_version. starts_with ( "1." ) {
130+ ( "/metrics" , METRICS_PORT , "http" )
131+ } else {
132+ ( "/nifi-api/flow/metrics/prometheus" , HTTPS_PORT , "https" )
133+ } ;
134+
135+ Annotations :: try_from ( [
136+ ( "prometheus.io/path" . to_owned ( ) , path. to_owned ( ) ) ,
137+ ( "prometheus.io/port" . to_owned ( ) , port. to_string ( ) ) ,
138+ ( "prometheus.io/scheme" . to_owned ( ) , scheme. to_owned ( ) ) ,
139+ ( "prometheus.io/scrape" . to_owned ( ) , "true" . to_owned ( ) ) ,
140+ ] )
141+ . expect ( "should be valid annotations" )
136142}
0 commit comments