Files
librenms-librenms/lib/influxdb-php/src/InfluxDB/Point.php
Dave Bell 79c7540fa7 Merge commit '4430658932762ead3661231492b8074f144ea4b6' into influxdb-php
Conflicts:
	lib/influxdb-php/.gitignore
	lib/influxdb-php/README.md
2016-03-29 23:06:15 +01:00

251 lines
5.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace InfluxDB;
use InfluxDB\Database\Exception as DatabaseException;
/**
* Class Point
*
* @package InfluxDB
*/
class Point
{
/**
* @var string
*/
protected $measurement;
/**
* @var array
*/
protected $tags = [];
/**
* @var array
*/
protected $fields = [];
/**
* @var string
*/
protected $timestamp;
/**
* The timestamp is optional. If you do not specify a timestamp the servers
* local timestamp will be used
*
* @param string $measurement
* @param float $value
* @param array $tags
* @param array $additionalFields
* @param null $timestamp
* @throws DatabaseException
*/
public function __construct(
$measurement,
$value = null,
array $tags = array(),
array $additionalFields = array(),
$timestamp = null
) {
if (empty($measurement)) {
throw new DatabaseException('Invalid measurement name provided');
}
$this->measurement = (string) $measurement;
$this->tags = $tags;
$fields = $additionalFields;
if ($value !== null) {
$fields['value'] = $value;
}
$this->setFields($fields);
if ($timestamp && !$this->isValidTimeStamp($timestamp)) {
throw new DatabaseException(sprintf('%s is not a valid timestamp', $timestamp));
}
$this->timestamp = $timestamp;
}
/**
* @see: https://influxdb.com/docs/v0.9/concepts/reading_and_writing_data.html
*
* Should return this format
* 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'
*/
public function __toString()
{
$string = $this->measurement;
if (count($this->tags) > 0) {
$string .= ',' . $this->arrayToString($this->escapeCharacters($this->tags));
}
$string .= ' ' . $this->arrayToString($this->escapeCharacters($this->fields));
if ($this->timestamp) {
$string .= ' '.$this->timestamp;
}
return $string;
}
/**
* @return string
*/
public function getMeasurement()
{
return $this->measurement;
}
/**
* @param string $measurement
*/
public function setMeasurement($measurement)
{
$this->measurement = $measurement;
}
/**
* @return array
*/
public function getTags()
{
return $this->tags;
}
/**
* @param array $tags
*/
public function setTags($tags)
{
$this->tags = $tags;
}
/**
* @return array
*/
public function getFields()
{
return $this->fields;
}
/**
* @param array $fields
*/
public function setFields($fields)
{
foreach ($fields as &$field) {
if (is_integer($field)) {
$field = sprintf('%di', $field);
} elseif (is_string($field)) {
$field = sprintf("\"%s\"", $field);
} elseif (is_bool($field)) {
$field = ($field ? "true" : "false");
}
}
$this->fields = $fields;
}
/**
* @return string
*/
public function getTimestamp()
{
return $this->timestamp;
}
/**
* @param string $timestamp
*/
public function setTimestamp($timestamp)
{
$this->timestamp = $timestamp;
}
/**
* Escapes invalid characters in both the array key and array value
*
* @param array $arr
* @return array
*/
private function escapeCharacters(array $arr)
{
$returnArr = [];
foreach ($arr as $key => $value) {
$returnArr[$this->addSlashes($key)] = $this->addSlashes($value);
}
return $returnArr;
}
/**
* Returns strings with space, comma, or equals sign characters backslashed per Influx write protocol syntax
*
* @param string $value
* @return string
*/
private function addSlashes($value)
{
return str_replace([
' ',
',',
'='
],[
'\ ',
'\,',
'\='
], $value);
}
/**
* @param array $arr
* @return string
*/
private function arrayToString(array $arr)
{
$strParts = [];
foreach ($arr as $key => $value) {
$strParts[] = sprintf('%s=%s', $key, $value);
}
return implode(',', $strParts);
}
/**
* @param int $timestamp
* @return bool
*/
private function isValidTimeStamp($timestamp)
{
// if the code is run on a 32bit system, loosely check if the timestamp is a valid numeric
if (PHP_INT_SIZE == 4 && is_numeric($timestamp)) {
return true;
}
if (!is_numeric($timestamp)) {
return false;
}
if (intval($timestamp) != $timestamp) {
return false;
}
if (!($timestamp <= PHP_INT_MAX && $timestamp >= ~PHP_INT_MAX)) {
return false;
}
return true;
}
}