feature: allow the user to pass a delimiter to as_influx

This commit is contained in:
Brett Rowan
2025-03-04 20:14:55 -07:00
parent ec1b2ca162
commit 8852fab3ee
3 changed files with 17 additions and 10 deletions

View File

@@ -361,7 +361,9 @@ class MinerData(BaseModel):
data_list = [str(data[item]) for item in data]
return ",".join(data_list)
def as_influxdb(self, measurement_name: str = "miner_data") -> str:
def as_influxdb(
self, measurement_name: str = "miner_data", level_delimiter: str = "."
) -> str:
"""Get this dataclass as [influxdb line protocol](https://docs.influxdata.com/influxdb/v2.4/reference/syntax/line-protocol/).
Parameters:
@@ -392,7 +394,8 @@ class MinerData(BaseModel):
lambda x: x is not None,
[
serialization_map.get(type(v), lambda _k, _v: None)(
f"{key}.{i}", v
level_delimiter.join([key, i]),
v,
)
for i, v in enumerate(value)
],
@@ -401,16 +404,16 @@ class MinerData(BaseModel):
)
def serialize_fan(key: str, value: Fan) -> str:
return f"{key}.speed={value.speed}"
return f"{key}{level_delimiter}speed={value.speed}"
def serialize_hashboard(key: str, value: HashBoard) -> str:
return value.as_influxdb(key)
return value.as_influxdb(key, level_delimiter=level_delimiter)
def serialize_bool(key: str, value: bool):
return f"{key}={str(value).lower()}"
def serialize_pool_metrics(key: str, value: PoolMetrics):
return value.as_influxdb(key)
return value.as_influxdb(key, level_delimiter=level_delimiter)
include = [
"uptime",

View File

@@ -72,7 +72,7 @@ class HashBoard(BaseModel):
except AttributeError:
raise KeyError(f"{item}")
def as_influxdb(self, key_root: str) -> str:
def as_influxdb(self, key_root: str, level_delimiter: str = ".") -> str:
def serialize_int(key: str, value: int) -> str:
return f"{key}={value}"
@@ -116,7 +116,9 @@ class HashBoard(BaseModel):
serialization_func = serialization_map.get(
type(field_val), lambda _k, _v: None
)
serialized = serialization_func(f"{key_root}.{field}", field_val)
serialized = serialization_func(
f"{key_root}{level_delimiter}{field}", field_val
)
if serialized is not None:
field_data.append(serialized)
continue
@@ -124,7 +126,7 @@ class HashBoard(BaseModel):
if serialized is None:
if isinstance(field_val, datatype):
serialized = serialization_map_instance[datatype](
f"{key_root}.{field}", field_val
f"{key_root}{level_delimiter}{field}", field_val
)
if serialized is not None:
field_data.append(serialized)

View File

@@ -93,7 +93,7 @@ class PoolMetrics(BaseModel):
return 0
return (value / total) * 100
def as_influxdb(self, key_root: str) -> str:
def as_influxdb(self, key_root: str, level_delimiter: str = ".") -> str:
def serialize_int(key: str, value: int) -> str:
return f"{key}={value}"
@@ -133,7 +133,9 @@ class PoolMetrics(BaseModel):
serialization_func = serialization_map.get(
type(field_val), lambda _k, _v: None
)
serialized = serialization_func(f"{key_root}.{field}", field_val)
serialized = serialization_func(
f"{key_root}{level_delimiter}{field}", field_val
)
if serialized is not None:
field_data.append(serialized)