@@ -11,25 +11,6 @@ import (
1111 "strings"
1212 "time"
1313
14- "k8s.io/apimachinery/pkg/api/meta"
15- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16- "k8s.io/utils/ptr"
17-
18- configapi "github.com/ray-project/kuberay/ray-operator/apis/config/v1alpha1"
19- "github.com/ray-project/kuberay/ray-operator/controllers/ray/batchscheduler"
20- "github.com/ray-project/kuberay/ray-operator/controllers/ray/common"
21- "github.com/ray-project/kuberay/ray-operator/controllers/ray/expectations"
22- "github.com/ray-project/kuberay/ray-operator/controllers/ray/metrics"
23- "github.com/ray-project/kuberay/ray-operator/controllers/ray/utils"
24- "github.com/ray-project/kuberay/ray-operator/pkg/features"
25-
26- batchv1 "k8s.io/api/batch/v1"
27- rbacv1 "k8s.io/api/rbac/v1"
28-
29- "k8s.io/client-go/tools/record"
30-
31- rayv1 "github.com/ray-project/kuberay/ray-operator/apis/ray/v1"
32-
3314 "github.com/go-logr/logr"
3415 routev1 "github.com/openshift/api/route/v1"
3516 batchv1 "k8s.io/api/batch/v1"
@@ -57,7 +38,6 @@ import (
5738 "github.com/ray-project/kuberay/ray-operator/controllers/ray/batchscheduler"
5839 "github.com/ray-project/kuberay/ray-operator/controllers/ray/common"
5940 "github.com/ray-project/kuberay/ray-operator/controllers/ray/expectations"
60- "github.com/ray-project/kuberay/ray-operator/controllers/ray/metrics"
6141 "github.com/ray-project/kuberay/ray-operator/controllers/ray/utils"
6242 "github.com/ray-project/kuberay/ray-operator/pkg/features"
6343)
@@ -110,8 +90,13 @@ type RayClusterReconciler struct {
11090 options RayClusterReconcilerOptions
11191}
11292
93+ type RayClusterMetricsCollector interface {
94+ ObserveRayClusterProvisionedDuration (name , namespace string , duration float64 )
95+ ObserveRayClusterHeadPodReadyDuration (name , namespace string , duration float64 )
96+ }
97+
11398type RayClusterReconcilerOptions struct {
114- RayClusterMetricCollector * metrics. RayClusterMetricCollector
99+ RayClusterMetricCollector RayClusterMetricsCollector
115100 HeadSidecarContainers []corev1.Container
116101 WorkerSidecarContainers []corev1.Container
117102 IsOpenShift bool
@@ -348,6 +333,8 @@ func (r *RayClusterReconciler) rayClusterReconcile(ctx context.Context, instance
348333 inconsistent , updateErr = r .updateRayClusterStatus (ctx , originalRayClusterInstance , newInstance )
349334 }
350335
336+ emitRayClusterMetrics (r .options .RayClusterMetricCollector , newInstance .Name , newInstance .Namespace , originalRayClusterInstance .Status , newInstance .Status , newInstance .CreationTimestamp .Time )
337+
351338 // Return error based on order.
352339 var err error
353340 if reconcileErr != nil {
@@ -1288,16 +1275,6 @@ func (r *RayClusterReconciler) calculateStatus(ctx context.Context, instance *ra
12881275 })
12891276 } else {
12901277 headPodReadyCondition := utils .FindHeadPodReadyCondition (headPod )
1291-
1292- // Record ray_cluster_head_pod_ready_duration_seconds metric
1293- // Calculate the time from RayClusters created to head pod ready
1294- // if headPodReadyCondition.Status == metav1.ConditionTrue {
1295- // if !meta.IsStatusConditionTrue(newInstance.Status.Conditions, string(rayv1.HeadPodReady)) {
1296- // readyDuration := time.Since(instance.CreationTimestamp.Time)
1297- // common.ObserveRayClusterHeadPodReadyDuration(instance.Namespace, readyDuration)
1298- // }
1299- // }
1300-
13011278 meta .SetStatusCondition (& newInstance .Status .Conditions , headPodReadyCondition )
13021279 }
13031280
@@ -1637,21 +1614,28 @@ func (r *RayClusterReconciler) updateRayClusterStatus(ctx context.Context, origi
16371614 if err != nil {
16381615 logger .Info ("Error updating status" , "name" , originalRayClusterInstance .Name , "error" , err , "RayCluster" , newInstance )
16391616 }
1640- collectRayClusterMetrics (r .options .RayClusterMetricCollector , newInstance .Name , newInstance .Namespace , newInstance .Status , originalRayClusterInstance .Status , originalRayClusterInstance .CreationTimestamp .Time )
16411617
16421618 return inconsistent , err
16431619}
16441620
1645- // collectRayClusterMetrics records metrics related to the RayCluster.
1646- func collectRayClusterMetrics (collector * metrics.RayClusterMetricCollector , name , namespace string , newClusterStatus , oldClusterStatus rayv1.RayClusterStatus , creationTimestamp time.Time ) {
1647- if collector == nil {
1648- return
1621+ func emitRayClusterMetrics (rayClusterMetricsCollector RayClusterMetricsCollector , rayClusterName , rayClusterNamespace string , originRayClusterStatus , rayClusterStatus rayv1.RayClusterStatus , creationTimestamp time.Time ) {
1622+ emitRayClusterProvisionedDuration (rayClusterMetricsCollector , rayClusterName , rayClusterNamespace , originRayClusterStatus , rayClusterStatus , creationTimestamp )
1623+ emitRayClusterHeadPodReadyDuration (rayClusterMetricsCollector , rayClusterName , rayClusterNamespace , originRayClusterStatus , rayClusterStatus , creationTimestamp )
1624+ }
1625+
1626+ func emitRayClusterProvisionedDuration (collector RayClusterMetricsCollector , rayClusterName , rayClusterNamespace string , originRayClusterStatus , rayClusterStatus rayv1.RayClusterStatus , creationTimestamp time.Time ) {
1627+ // Emit kuberay_cluster_provisioned_duration_seconds when a RayCluster's RayClusterProvisioned status transitions from false (or unset) to true
1628+ if ! meta .IsStatusConditionTrue (originRayClusterStatus .Conditions , string (rayv1 .RayClusterProvisioned )) &&
1629+ meta .IsStatusConditionTrue (rayClusterStatus .Conditions , string (rayv1 .RayClusterProvisioned )) {
1630+ collector .ObserveRayClusterProvisionedDuration (rayClusterName , rayClusterNamespace , time .Since (creationTimestamp ).Seconds ())
16491631 }
1632+ }
16501633
1651- // Record `kuberay_cluster_provisioned_duration_seconds` metric if just provisioned
1652- if meta .IsStatusConditionTrue (newClusterStatus .Conditions , string (rayv1 .RayClusterProvisioned )) &&
1653- ! meta .IsStatusConditionTrue (oldClusterStatus .Conditions , string (rayv1 .RayClusterProvisioned )) {
1654- collector .ObserveRayClusterProvisionedDuration (name , namespace , time .Since (creationTimestamp ).Seconds ())
1634+ func emitRayClusterHeadPodReadyDuration (collector RayClusterMetricsCollector , rayClusterName , rayClusterNamespace string , originRayClusterStatus , rayClusterStatus rayv1.RayClusterStatus , creationTimestamp time.Time ) {
1635+ // Emit kuberay_cluster_head_pod_ready_duration_seconds when a RayCluster's HeadPodReady status transitions from false (or unset) to true
1636+ if ! meta .IsStatusConditionTrue (originRayClusterStatus .Conditions , string (rayv1 .HeadPodReady )) &&
1637+ meta .IsStatusConditionTrue (rayClusterStatus .Conditions , string (rayv1 .HeadPodReady )) {
1638+ collector .ObserveRayClusterHeadPodReadyDuration (rayClusterName , rayClusterNamespace , time .Since (creationTimestamp ).Seconds ())
16551639 }
16561640}
16571641
0 commit comments