Select Git revision
time_series.go
time_series.go 14.82 KiB
package search
import (
"bytes"
"context"
"encoding/json"
"io/ioutil"
"net/http"
"reflect"
"strings"
"time"
opensearchapi "github.com/opensearch-project/opensearch-go/opensearchapi"
"gitlab.com/uafrica/go-utils/errors"
"gitlab.com/uafrica/go-utils/logger"
"gitlab.com/uafrica/go-utils/reflection"
)
const TimeFormat = "2006-01-02T15:04:05Z07:00"
//embed this into your log struct
type TimeSeriesHeader struct {
StartTime time.Time `json:"@timestamp"`
EndTime time.Time `json:"@end_time"`
DurationMs int64 `json:"@duration_ms"`
}
type TimeSeries interface {
Write(StartTime time.Time, EndTime time.Time, data interface{}) error
//Search() returns docs indexed on OpenSearch document ID which cat be used in Get(id)
//The docs value type is the same as that of tmpl specified when you created the TimeSeries(..., tmpl)
//So you can safely type assert e.g.
// type myType struct {...}
// ts := search.TimeSeries(..., myType{})
// docs,totalCount,err := ts.Search(...)
// if err == nil {
// for id,docValue := range docs {
// doc := docValue.(myType)
// ...
// }
// }
Search(query Query, limit int64) (docs map[string]interface{}, totalCount int, err error)
//Get() takes the id returned in Search()
//The id is uuid assigned by OpenSearch when documents are added with Write().
//The document value type is the same as that of tmpl specified when you created the TimeSeries(..., tmpl)
Get(id string) (interface{}, error)
}
type timeSeries struct {
w *writer
name string
dataType reflect.Type
settings Settings
mappings Mappings
jsonSettings []byte
jsonMappings []byte
createdDates map[string]bool
searchResponseBodyType reflect.Type
}
//purpose:
// create a time series to write e.g. api logs
//parameters:
// name must be the openSearch index name prefix without the date, e.g. "uafrica-v3-api-logs"
// the actual indices in openSearch will be called "<indexName>-<ccyymmdd>" e.g. "uafrica-v3-api-logs-20210102"
// tmpl must be your log data struct consisting of public fields as:
// Xxx string `json:"<name>" search:"keyword|text|long|date"` (can later add more types)