diff --git a/opengemini/client.go b/opengemini/client.go index b5f545e..cb53536 100644 --- a/opengemini/client.go +++ b/opengemini/client.go @@ -2,6 +2,7 @@ package opengemini import ( "crypto/tls" + "net/http" "time" ) @@ -18,7 +19,9 @@ type Client interface { Ping(idx int) error Query(query Query) (*QueryResult, error) - // WriteBatchPoints batch points to assigned database + // WritePoint write single point to assigned database + WritePoint(database string, point *Point, callbackFunc func(*http.Response, error)) + // WriteBatchPoints write batch points to assigned database WriteBatchPoints(database string, bp *BatchPoints) error // CreateDatabase Create database CreateDatabase(database string) error diff --git a/opengemini/write.go b/opengemini/write.go index f82e819..cabbd67 100644 --- a/opengemini/write.go +++ b/opengemini/write.go @@ -56,3 +56,33 @@ func (c *client) WriteBatchPoints(database string, bp *BatchPoints) error { } return nil } + +func (c *client) WritePoint(database string, point *Point, callbackFunc func(*http.Response, error)) { + var buffer bytes.Buffer + + var writer io.Writer + + if c.config.GzipEnabled { + writer = gzip.NewWriter(&buffer) + } else { + writer = &buffer + } + + if _, err := io.WriteString(writer, point.String()); err != nil { + callbackFunc(nil, err) + } + + if closer, ok := writer.(io.Closer); ok { + if err := closer.Close(); err != nil { + callbackFunc(nil, err) + } + } + + req := requestDetails{ + queryValues: make(url.Values), + body: &buffer, + } + req.queryValues.Add("db", database) + resp, err := c.executeHttpPost(UrlWrite, req) + callbackFunc(resp, err) +} diff --git a/opengemini/write_test.go b/opengemini/write_test.go index e7ae3b9..9b9aa3d 100644 --- a/opengemini/write_test.go +++ b/opengemini/write_test.go @@ -2,11 +2,12 @@ package opengemini import ( "github.com/stretchr/testify/assert" + "net/http" "testing" "time" ) -func TestClient_Write(t *testing.T) { +func TestClient_WriteBatchPoints(t *testing.T) { c := testDefaultClient(t) // create a test database with rand suffix @@ -60,3 +61,29 @@ func TestClient_Write(t *testing.T) { assert.Nil(t, err) assert.Equal(t, 2, len(result.Results[0].Series[0].Values)) } + +func TestClient_WritePoint(t *testing.T) { + c := testDefaultClient(t) + + // create a test database with rand suffix + database := randomDatabaseName() + err := c.CreateDatabase(database) + assert.Nil(t, err) + + // delete test database before exit test case + defer func() { + err := c.DropDatabase(database) + assert.Nil(t, err) + }() + + callback := func(resp *http.Response, err error) { + assert.Equal(t, resp.StatusCode, http.StatusNoContent) + assert.Nil(t, err) + } + point := &Point{} + point.Measurement = randomMeasurement() + point.AddTag("tag", "test") + point.AddField("field", "test") + c.WritePoint(database, point, callback) + +}