query weatherdata in influx

This commit is contained in:
Joel Schmid 2021-03-16 20:43:15 +01:00
parent 0540519d68
commit ea41163296
3 changed files with 78 additions and 1 deletions

View file

@ -40,9 +40,20 @@ func (api *weatherRestApi) handleRequests() *mux.Router {
router.HandleFunc("/random", api.randomWeatherHandler) router.HandleFunc("/random", api.randomWeatherHandler)
router.HandleFunc("/randomlist", api.randomWeatherListHandler) router.HandleFunc("/randomlist", api.randomWeatherListHandler)
router.HandleFunc("/addData", api.addDataHandler) router.HandleFunc("/addData", api.addDataHandler)
router.HandleFunc("/getData", api.getData)
return router return router
} }
func (api *weatherRestApi) getData(w http.ResponseWriter, r *http.Request) {
w.Header().Add("content-type", "application/json")
data, err := api.weaterStorage.GetData()
if err != nil {
http.Error(w, "", http.StatusBadRequest)
return
}
json.NewEncoder(w).Encode(data)
}
func (api *weatherRestApi) randomWeatherHandler(w http.ResponseWriter, r *http.Request) { func (api *weatherRestApi) randomWeatherHandler(w http.ResponseWriter, r *http.Request) {
datapoint := storage.NewRandomWeatherData("swablab") datapoint := storage.NewRandomWeatherData("swablab")

View file

@ -1,6 +1,10 @@
package storage package storage
import ( import (
"context"
"fmt"
"time"
influxdb2 "github.com/influxdata/influxdb-client-go/v2" influxdb2 "github.com/influxdata/influxdb-client-go/v2"
) )
@ -10,6 +14,7 @@ type influxStorage struct {
bucket string bucket string
organization string organization string
url string url string
measurement string
client influxdb2.Client client influxdb2.Client
} }
@ -21,6 +26,7 @@ func NewInfluxStorage(token, bucket, organization, url string) (*influxStorage,
influx.organization = organization influx.organization = organization
influx.url = url influx.url = url
influx.client = influxdb2.NewClient(url, token) influx.client = influxdb2.NewClient(url, token)
influx.measurement = "data"
return influx, nil return influx, nil
} }
@ -34,7 +40,7 @@ func (storage *influxStorage) Save(data WeatherData) error {
"humidity": data.Humidity, "humidity": data.Humidity,
"pressure": data.Pressure} "pressure": data.Pressure}
datapoint := influxdb2.NewPoint("new2", datapoint := influxdb2.NewPoint(storage.measurement,
tags, tags,
fields, fields,
data.TimeStamp) data.TimeStamp)
@ -44,6 +50,65 @@ func (storage *influxStorage) Save(data WeatherData) error {
return nil return nil
} }
//GetData datapoints from InfluxDB
func (storage *influxStorage) GetData() ([]*WeatherData, error) {
query := fmt.Sprintf("from(bucket:\"%v\")|> range(start: -40m, stop: -20m) |> filter(fn: (r) => r._measurement == \"data\" and r.location == \"Hamburg\")", storage.bucket)
res, err := storage.executeFluxQuery(query)
return res, err
}
func (storage *influxStorage) executeFluxQuery(query string) ([]*WeatherData, error) {
queryAPI := storage.client.QueryAPI(storage.organization)
result, err := queryAPI.Query(context.Background(), query)
if err != nil {
return nil, err
}
var queryResults []*WeatherData
for result.Next() {
if result.Err() != nil {
return nil, err
}
location := result.Record().ValueByKey("location").(string)
timestamp := result.Record().Time()
data, contained := containsWeatherData(queryResults, location, timestamp)
if result.Record().Field() == "temperature" {
data.Temperature = result.Record().Value().(float64)
}
if result.Record().Field() == "pressure" {
data.Pressure = result.Record().Value().(float64)
}
if result.Record().Field() == "humidity" {
data.Humidity = result.Record().Value().(float64)
}
if !contained {
data.Location = location
data.TimeStamp = timestamp
queryResults = append(queryResults, data)
}
}
return queryResults, nil
}
func containsWeatherData(weatherData []*WeatherData, location string, timestamp time.Time) (*WeatherData, bool) {
for _, val := range weatherData {
if val.Location == location && val.TimeStamp == timestamp {
return val, true
}
}
var newData WeatherData
return &newData, false
}
//Close InfluxDB connection //Close InfluxDB connection
func (storage *influxStorage) Close() error { func (storage *influxStorage) Close() error {
storage.client.Close() storage.client.Close()

View file

@ -8,6 +8,7 @@ import (
//WeatherStorage interface for different storage-implementations of weather data //WeatherStorage interface for different storage-implementations of weather data
type WeatherStorage interface { type WeatherStorage interface {
Save(WeatherData) error Save(WeatherData) error
GetData() ([]*WeatherData, error)
Close() error Close() error
} }