ETL-Yertl
view release on metacpan or search on metacpan
lib/ETL/Yertl/Adapter/graphite.pm view on Meta::CPAN
};
}
#pod =method read_ts
#pod
#pod my @points = $db->read_ts( $query );
#pod
#pod Read a time series from the database. C<$query> is a hash reference
#pod with the following keys:
#pod
#pod =over
#pod
#pod =item metric
#pod
#pod The time series to read. For Graphite, this is a path separated by dots
#pod (C<.>).
#pod
#pod =item start
#pod
#pod An ISO8601 date/time for the start of the series points to return,
#pod inclusive.
#pod
#pod =item end
#pod
#pod An ISO8601 date/time for the end of the series points to return,
#pod inclusive.
#pod
#pod =item tags
#pod
#pod B<NOTE>: Graphite does not support per-value tags. Using this field will
#pod cause a fatal error.
#pod
#pod =back
#pod
#pod =cut
sub read_ts {
my ( $self, $query ) = @_;
die "Tags are not supported by Graphite" if $query->{tags} && keys %{ $query->{tags} };
my $metric = $query->{ metric };
my %form = (
target => $metric,
format => 'json',
noNullPoints => 'true',
);
if ( $query->{ start } ) {
$form{ from } = _format_graphite_dt( $query->{start} );
}
if ( $query->{ end } ) {
$form{ until } = _format_graphite_dt( $query->{end} );
}
my $url = URI->new( sprintf 'http://%s:%s/render', $self->{host}, $self->{http_port} );
$url->query_form( %form );
#; say "Fetching $url";
my $res = $self->http_client->GET( $url )->get;
#; say $res->decoded_content;
if ( $res->is_error ) {
die sprintf "Error fetching metric '%s': " . $res->decoded_content . "\n", $metric;
}
my $result = decode_json( $res->decoded_content );
my @points;
for my $series ( @{ $result } ) {
for my $point ( @{ $series->{datapoints} } ) {
push @points, {
metric => $series->{target},
timestamp => Time::Piece->gmtime( $point->[1] )->datetime,
value => $point->[0],
};
}
}
return @points;
}
#pod =method write_ts
#pod
#pod $db->write_ts( @points );
#pod
#pod Write time series points to the database. C<@points> is an array
#pod of hashrefs with the following keys:
#pod
#pod =over
#pod
#pod =item metric
#pod
#pod The metric to write. For Graphite, this is a path separated by dots
#pod (C<.>).
#pod
#pod =item timestamp
#pod
#pod An ISO8601 timestamp or UNIX epoch time. Optional. Defaults to the
#pod current time.
#pod
#pod =item value
#pod
#pod The metric value.
#pod
#pod =item tags
#pod
#pod B<NOTE>: Graphite does not support per-value tags. Using this field will
#pod cause a fatal error.
#pod
#pod =back
#pod
#pod =cut
sub write_ts {
my ( $self, @points ) = @_;
my $sock = $self->write_client;
for my $point ( @points ) {
die "Tags are not supported by Graphite" if $point->{tags} && keys %{ $point->{tags} };
$point->{timestamp} ||= time;
$point->{timestamp} =~ s/[.]\d+Z?$//; # We do not support nanoseconds
if ( !looks_like_number( $point->{timestamp} ) ) {
$point->{timestamp} = Time::Piece->strptime( $point->{timestamp}, '%Y-%m-%dT%H:%M:%S' )->epoch;
}
$sock->write(
join( " ", $point->{metric}, $point->{value}, $point->{timestamp}, )
. "\n",
);
( run in 1.961 second using v1.01-cache-2.11-cpan-92ad3014f07 )