windows_exporter icon indicating copy to clipboard operation
windows_exporter copied to clipboard

Improvement: Add owner_node on resource and resourcegroup for mscluster

Open webalexeu opened this issue 2 years ago • 11 comments

Hello,

This PR will add owner_node label on resource and resourcegroup metrics for mscluster (It has been tested)

Let me know if you need additionnal details or some code adjustements

Thank you, Alex

webalexeu avatar Jan 25 '24 15:01 webalexeu

Hello reviewers @jkroepke @breed808,

Can you please have a look at this PR ?

Thank you, Alex

webalexeu avatar Feb 03 '24 09:02 webalexeu

Hi @webalexeu

I have this PR on my list, however I'm currently limited in PR review, since a destroyed my laptop weeks ago.

jkroepke avatar Feb 03 '24 09:02 jkroepke

Hi @webalexeu

I have this PR on my list, however I'm currently limited in PR review, since a destroyed my laptop weeks ago.

Do you want to have an output before and after the change ?

I can also provide the compiled version as well if it can help you

webalexeu avatar Feb 03 '24 10:02 webalexeu

If you have a screenshot from the owner inside the sql system + the output from the metrics, it would help a lot. I dont have any mscluster expericence.

jkroepke avatar Feb 04 '24 19:02 jkroepke

If you have a screenshot from the owner inside the sql system + the output from the metrics, it would help a lot. I dont have any mscluster expericence.

This is the output of the metrics and the cmdlet output of the cluster associated (To keep output short, only the state but owner_node is defined on every metrics generated for both collectors)

windows_mscluster_resource_state gauge

windows_mscluster_resource_state{name="Cluster IP DC1",owner_group="Cluster",owner_node="node2",type="IP Address"} 3 windows_mscluster_resource_state{name="Cluster IP DC2",owner_group="Cluster",owner_node="node2",type="IP Address"} 3 windows_mscluster_resource_state{name="Cluster IP DC3",owner_group="Cluster",owner_node="node2",type="IP Address"} 2 windows_mscluster_resource_state{name="Cluster VIP",owner_group="Cluster",owner_node="node2",type="Network Name"} 2 windows_mscluster_resource_state{name="sql1",owner_group="sql1",owner_node="node2",type="SQL Server Availability Group"} 2 windows_mscluster_resource_state{name="sql1_ip_dc1",owner_group="sql1",owner_node="node2",type="IP Address"} 3 windows_mscluster_resource_state{name="sql1_ip_dc2",owner_group="sql1",owner_node="node2",type="IP Address"} 2 windows_mscluster_resource_state{name="sql1_ip_dc3",owner_group="sql1",owner_node="node2",type="IP Address"} 3 windows_mscluster_resource_state{name="sql1_sql1-ag1",owner_group="sql1",owner_node="node2",type="Network Name"} 2

Get-ClusterResource | Select Name,OwnerGroup,OwnerNode,ResourceType,State | ft
Name           OwnerGroup OwnerNode ResourceType                    State
----           ---------- --------- ------------                    -----
Cluster IP DC3 Cluster    node2     IP Address                    Offline
Cluster IP DC1 Cluster    node2     IP Address                    Offline
Cluster IP DC2 Cluster    node2     IP Address                     Online
Cluster VIP    Cluster    node2     Network Name                   Online
sql1           sql1       node2     SQL Server Availability Group  Online
sql1_ip_dc1    sql1       node2     IP Address                    Offline
sql1_ip_dc2    sql1       node2     IP Address                     Online
sql1_ip_dc3    sql1       node2     IP Address                    Offline
sql1_sql1-ag1  sql1       node2     Network Name                   Online

windows_mscluster_resourcegroup_state gauge

windows_mscluster_resourcegroup_state{name="Available Storage",owner_node="node2"} 1 windows_mscluster_resourcegroup_state{name="Cluster",owner_node="node2"} 0 windows_mscluster_resourcegroup_state{name="sql1",owner_node="node2"} 0

Get-ClusterGroup
Name              OwnerNode   State
----              ---------   -----
Available Storage node2     Offline
Cluster           node2      Online
sql1              node2      Online

webalexeu avatar Feb 04 '24 21:02 webalexeu

I see, the owner node is something what could be changes from time to time, right?

Reading https://prometheus.io/docs/practices/naming/#labels

CAUTION: Remember that every unique combination of key-value label pairs represents a new time series, which can dramatically increase the amount of data stored. Do not use labels to store dimensions with high cardinality (many different label values), such as user IDs, email addresses, or other unbounded sets of values.

It's an sub-optimal use-case for an label value.

I can see, that owner node is attached to each metric. Is it sufficient to have the label only on windows_mscluster_resource_state and windows_mscluster_resourcegroup_state?

The label could be attach to results via operator, e.g.:

metric + on(name) group_left(owner_node) windows_mscluster_resource_state * 0

I'm aware that owner_group is attached everywhere, too. Thats also something, was is not strictly nessesary.

jkroepke avatar Feb 04 '24 21:02 jkroepke

Indeed, OwnerNode will change on every failover of ressources within the cluster

There is no need indeed to have that label on every metrics and have it on state should be enough

I will update then my PR

Thanks for the review

webalexeu avatar Feb 04 '24 21:02 webalexeu

I convert the PR to draft, please let me know, when you finished

jkroepke avatar Feb 16 '24 14:02 jkroepke

Hello @jkroepke , I've review the PR based on our discussion Finally, I've generate new metrics for owner node and not new labels So based on the previous example, here is the new metrics generated:

HELP windows_mscluster_resource_owner_node The node hosting the resource. 0: Not hosted; 1: Hosted TYPE windows_mscluster_resource_owner_node gauge

windows_mscluster_resource_owner_node{name="Cluster IP DC1",owner_group="Cluster",node_name="node1",type="IP Address"} 1 windows_mscluster_resource_owner_node{name="Cluster IP DC1",owner_group="Cluster",node_name="node2",type="IP Address"} 0 windows_mscluster_resource_owner_node{name="Cluster IP DC2",owner_group="Cluster",node_name="node1",type="IP Address"} 1 windows_mscluster_resource_owner_node{name="Cluster IP DC2",owner_group="Cluster",node_name="node2",type="IP Address"} 0 windows_mscluster_resource_owner_node{name="Cluster IP DC3",owner_group="Cluster",node_name="node1",type="IP Address"} 1 windows_mscluster_resource_owner_node{name="Cluster IP DC3",owner_group="Cluster",node_name="node2",type="IP Address"} 0 windows_mscluster_resource_owner_node{name="Cluster VIP",owner_group="Cluster",node_name="node1",type="Network Name"} 1 windows_mscluster_resource_owner_node{name="Cluster VIP",owner_group="Cluster",node_name="node2",type="Network Name"} 0 windows_mscluster_resource_owner_node{name="sql1",owner_group="sql1",node_name="node1",type="SQL Server Availability Group"} 0 windows_mscluster_resource_owner_node{name="sql1",owner_group="sql1",node_name="node2",type="SQL Server Availability Group"} 1 windows_mscluster_resource_owner_node{name="sql1_ip_dc1",owner_group="sql1",node_name="node1",type="IP Address"} 0 windows_mscluster_resource_owner_node{name="sql1_ip_dc1",owner_group="sql1",node_name="node2",type="IP Address"} 1 windows_mscluster_resource_owner_node{name="sql1_ip_dc2",owner_group="sql1",node_name="node1",type="IP Address"} 0 windows_mscluster_resource_owner_node{name="sql1_ip_dc2",owner_group="sql1",node_name="node2",type="IP Address"} 1 windows_mscluster_resource_owner_node{name="sql1_ip_dc3",owner_group="sql1",node_name="node1",type="IP Address"} 0 windows_mscluster_resource_owner_node{name="sql1_ip_dc3",owner_group="sql1",node_name="node2",type="IP Address"} 1 windows_mscluster_resource_owner_node{name="sql1_sql1-ag1",owner_group="sql1",node_name="node1",type="Network Name"} 0 windows_mscluster_resource_owner_node{name="sql1_sql1-ag1",owner_group="sql1",node_name="node2",type="Network Name"} 1

Get-ClusterResource | Select Name,OwnerGroup,OwnerNode,ResourceType,State | ft
Name           OwnerGroup OwnerNode ResourceType                    State
----           ---------- --------- ------------                    -----
Cluster IP DC3 Cluster    node1     IP Address                    Offline
Cluster IP DC1 Cluster    node1     IP Address                    Offline
Cluster IP DC2 Cluster    node1     IP Address                     Online
Cluster VIP    Cluster    node1     Network Name                   Online
sql1           sql1       node2     SQL Server Availability Group  Online
sql1_ip_dc1    sql1       node2     IP Address                    Offline
sql1_ip_dc2    sql1       node2     IP Address                     Online
sql1_ip_dc3    sql1       node2     IP Address                    Offline
sql1_sql1-ag1  sql1       node2     Network Name                   Online

HELP windows_mscluster_resourcegroup_owner_node The node hosting the resource group. 0: Not hosted; 1: Hosted TYPE windows_mscluster_resourcegroup_owner_node gauge

windows_mscluster_resourcegroup_owner_node{name="Available Storage",node_name="node1"} 0 windows_mscluster_resourcegroup_owner_node{name="Available Storage",node_name="node2"} 1 windows_mscluster_resourcegroup_owner_node{name="Cluster",node_name="node1"} 1 windows_mscluster_resourcegroup_owner_node{name="Cluster",node_name="node2"} 0 windows_mscluster_resourcegroup_owner_node{name="sql1",node_name="node1"} 0 windows_mscluster_resourcegroup_owner_node{name="sql1",node_name="node2"} 1

Get-ClusterGroup
Name              OwnerNode   State
----              ---------   -----
Available Storage node2     Offline
Cluster           node1      Online
sql1              node2      Online

Let me know if you want additionnal details or some code review

Thank you

webalexeu avatar Feb 16 '24 15:02 webalexeu

@webalexeu It looks good to me here.

You last post explains the feature well. Could you please copy the content to the docs docs/collector.mscluster_resource.md? It explains it really well!

jkroepke avatar Feb 16 '24 15:02 jkroepke

@webalexeu It looks good to me here.

You last post explains the feature well. Could you please copy the content to the docs docs/collector.mscluster_resource.md? It explains it really well!

I already put example and useful queries

Under which section do you want me to put it ?

webalexeu avatar Feb 16 '24 20:02 webalexeu

Hello @jkroepke ,

Any idea when you will release a new version of the exporter ?

Have a nice weekend, Alex

webalexeu avatar May 05 '24 14:05 webalexeu