App-ElasticSearch-Utilities
view release on metacpan or search on metacpan
lib/App/ElasticSearch/Utilities/Metrics.pm view on Meta::CPAN
return 0;
},
);
has 'with_index_metrics' => (
is => 'lazy',
isa => Bool,
builder => sub {
my ($self) = @_;
if( my $info = $self->node_details ) {
return !!grep { /^data/ } @{ $info->{roles} };
}
return 0;
},
);
sub get_metrics {
my ($self) = @_;
# Fetch Node Local Stats
my @collected = $self->collect_node_metrics();
push @collected, $self->collect_cluster_metrics()
if $self->with_cluster_metrics;
push @collected, $self->collect_index_metrics()
if $self->with_index_metrics;
# Flatten Collected and Return the Stats
return \@collected;
}
sub collect_node_metrics {
my ($self) = @_;
if( my $res = $self->request('_nodes/_local/stats')->content ) {
return $self->_stat_collector( $res->{nodes}{$self->node_id} );
}
# Explicit return of empty list
return;
}
sub collect_cluster_metrics {
my ($self) = @_;
my @stats = ();
if( my $res = $self->request('_cluster/health')->content ) {
push @stats,
{ key => "cluster.nodes.total", value => $res->{number_of_nodes}, },
{ key => "cluster.nodes.data", value => $res->{number_of_data_nodes}, },
{ key => "cluster.shards.primary", value => $res->{active_primary_shards}, },
{ key => "cluster.shards.active", value => $res->{active_shards}, },
{ key => "cluster.shards.initializing", value => $res->{initializing_shards}, },
{ key => "cluster.shards.relocating", value => $res->{relocating_shards}, },
{ key => "cluster.shards.unassigned", value => $res->{unassigned_shards}, },
;
}
push @stats, $self->_collect_index_blocks();
return @stats;
}
sub _collect_index_blocks {
my ($self) = @_;
my @req = (
'_settings/index.blocks.*',
{
index => '_all',
uri_param => {
flat_settings => 'true',
},
},
);
if( my $res = $self->request(@req)->content ) {
my %collected=();
foreach my $idx ( keys %{ $res } ) {
if( my $settings = $res->{$idx}{settings} ) {
foreach my $block ( keys %{ $settings } ) {
my $value = $settings->{$block};
if( lc $value eq 'true') {
$collected{$block} ||= 0;
$collected{$block}++;
}
}
}
}
return map { { key => "cluster.$_", value => $collected{$_} } } sort keys %collected;
}
# Explicit return of empty list
return;
}
sub collect_index_metrics {
my ($self) = @_;
my $id = $self->node_id;
my $shardres = $self->request('_cat/shards',
{
uri_param => {
local => 'true',
format => 'json',
bytes => 'b',
h => join(',', qw( index prirep docs store id state )),
}
}
)->content;
my %results;
foreach my $shard ( @{ $shardres } ) {
# Skip unallocated shards
next unless $shard->{id};
( run in 0.599 second using v1.01-cache-2.11-cpan-71847e10f99 )