diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 566a9e7038a..cff1d8c0eae 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -148,7 +148,6 @@ /pkg/tests/apis/ @grafana/grafana-app-platform-squad /pkg/tests/api/correlations/ @grafana/explore-squad /pkg/tsdb/grafanads/ @grafana/grafana-backend-group -/pkg/tsdb/legacydata/ @grafana/grafana-backend-group /pkg/tsdb/opentsdb/ @grafana/grafana-backend-group /pkg/util/ @grafana/grafana-backend-group /pkg/web/ @grafana/grafana-backend-group diff --git a/go.mod b/go.mod index 1dbb721e5b3..9d5d7c27c8b 100644 --- a/go.mod +++ b/go.mod @@ -99,7 +99,7 @@ require ( github.com/grafana/grafana-azure-sdk-go/v2 v2.0.4 // @grafana/partner-datasources github.com/grafana/grafana-google-sdk-go v0.1.0 // @grafana/partner-datasources github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79 // @grafana/grafana-backend-group - github.com/grafana/grafana-plugin-sdk-go v0.232.0 // @grafana/plugins-platform-backend + github.com/grafana/grafana-plugin-sdk-go v0.234.0 // @grafana/plugins-platform-backend github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240226124929-648abdbd0ea4 // @grafana/grafana-app-platform-squad github.com/grafana/grafana/pkg/apiserver v0.0.0-20240226124929-648abdbd0ea4 // @grafana/grafana-app-platform-squad // This needs to be here for other projects that import grafana/grafana @@ -156,7 +156,6 @@ require ( github.com/ua-parser/uap-go v0.0.0-20211112212520-00c877edfe0f // @grafana/grafana-backend-group github.com/urfave/cli v1.22.15 // @grafana/grafana-backend-group github.com/urfave/cli/v2 v2.25.0 // @grafana/grafana-backend-group - github.com/vectordotdev/go-datemath v0.1.1-0.20220323213446-f3954d0b18ae // @grafana/grafana-backend-group github.com/wk8/go-ordered-map v1.0.0 // @grafana/grafana-backend-group github.com/xlab/treeprint v1.2.0 // @grafana/observability-traces-and-profiling github.com/yudai/gojsondiff v1.0.0 // @grafana/grafana-backend-group @@ -461,6 +460,7 @@ require ( require ( github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 // indirect github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect + github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 // indirect ) // Use fork of crewjam/saml with fixes for some issues until changes get merged into upstream diff --git a/go.sum b/go.sum index ed0c2693015..d46a3804b69 100644 --- a/go.sum +++ b/go.sum @@ -2328,8 +2328,8 @@ github.com/grafana/grafana-google-sdk-go v0.1.0/go.mod h1:Vo2TKWfDVmNTELBUM+3lkr github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79 h1:r+mU5bGMzcXCRVAuOrTn54S80qbfVkvTdUJZfSfTNbs= github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79/go.mod h1:wc6Hbh3K2TgCUSfBC/BOzabItujtHMESZeFk5ZhdxhQ= github.com/grafana/grafana-plugin-sdk-go v0.114.0/go.mod h1:D7x3ah+1d4phNXpbnOaxa/osSaZlwh9/ZUnGGzegRbk= -github.com/grafana/grafana-plugin-sdk-go v0.232.0 h1:RnaQwhAOxYdp9wwy0Yz5cJUGY5tpIXPxoFWmEKflfww= -github.com/grafana/grafana-plugin-sdk-go v0.232.0/go.mod h1:bNgmNmub1I7Mc8dzIncgNqHC5jTgSZPPHlZ3aG8HKJQ= +github.com/grafana/grafana-plugin-sdk-go v0.234.0 h1:p20XfGKB3Z/8aZ6jut+FIU/0cXw+dLkcGFnxJbyFd+k= +github.com/grafana/grafana-plugin-sdk-go v0.234.0/go.mod h1:FlXjmBESxaD6Hoi8ojWLkH007nyjtJM3XC8SpwzF/YE= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240226124929-648abdbd0ea4 h1:hpyusz8c3yRFoJPlA0o34rWnsLbaOOBZleqRhFBi5Lg= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240226124929-648abdbd0ea4/go.mod h1:vrRQJuNprTWqwm6JPxHf3BoTJhvO15QMEjQ7Q/YUOnI= github.com/grafana/grafana/pkg/apiserver v0.0.0-20240226124929-648abdbd0ea4 h1:tIbI5zgos92vwJ8lV3zwHwuxkV03GR3FGLkFW9V5LxY= @@ -2600,6 +2600,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 h1:SwcnSwBR7X/5EHJQlXBockkJVIMRVt5yKaesBPMtyZQ= +github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6/go.mod h1:WrYiIuiXUMIvTDAQw97C+9l0CnBmCcvosPjN3XDqS/o= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -3219,8 +3221,6 @@ github.com/urfave/cli/v2 v2.25.0/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6f github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/vburenin/ifacemaker v1.2.1/go.mod h1:5WqrzX2aD7/hi+okBjcaEQJMg4lDGrpuEX3B8L4Wgrs= -github.com/vectordotdev/go-datemath v0.1.1-0.20220323213446-f3954d0b18ae h1:oyiy3uBj1F4O3AaFh7hUGBrJjAssJhKyAbwxtkslxqo= -github.com/vectordotdev/go-datemath v0.1.1-0.20220323213446-f3954d0b18ae/go.mod h1:PnwzbSst7KD3vpBzzlntZU5gjVa455Uqa5QPiKSYJzQ= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= github.com/wk8/go-ordered-map v1.0.0 h1:BV7z+2PaK8LTSd/mWgY12HyMAo5CEgkHqbkVq2thqr8= diff --git a/go.work.sum b/go.work.sum index 5610b526e09..71d6c6e7a35 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,5 +1,4 @@ buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1 h1:tdpHgTbmbvEIARu+bixzmleMi14+3imnpoFXz+Qzjp4= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew= buf.build/gen/go/grpc-ecosystem/grpc-gateway/bufbuild/connect-go v1.4.1-20221127060915-a1ecdc58eccd.1 h1:vp9EaPFSb75qe/793x58yE5fY1IJ/gdxb/kcDUzavtI= buf.build/gen/go/grpc-ecosystem/grpc-gateway/bufbuild/connect-go v1.4.1-20221127060915-a1ecdc58eccd.1/go.mod h1:YDq2B5X5BChU0lxAG5MxHpDb8mx1fv9OGtF2mwOe7hY= buf.build/gen/go/grpc-ecosystem/grpc-gateway/protocolbuffers/go v1.28.1-20221127060915-a1ecdc58eccd.4 h1:z3Xc9n8yZ5k/Xr4ZTuff76TAYP20dWy7ZBV4cGIpbkM= @@ -59,7 +58,6 @@ cloud.google.com/go/cloudtasks v1.12.4 h1:5xXuFfAjg0Z5Wb81j2GAbB3e0bwroCeSF+5jBn cloud.google.com/go/cloudtasks v1.12.6 h1:EUt1hIZ9bLv8Iz9yWaCrqgMnIU+Tdh0yXM1MMVGhjfE= cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= -cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= cloud.google.com/go/contactcenterinsights v1.12.1 h1:EiGBeejtDDtr3JXt9W7xlhXyZ+REB5k2tBgVPVtmNb0= cloud.google.com/go/contactcenterinsights v1.13.0 h1:6Vs/YnDG5STGjlWMEjN/xtmft7MrOTOnOZYUZtGTx0w= cloud.google.com/go/container v1.29.0 h1:jIltU529R2zBFvP8rhiG1mgeTcnT27KhU0H/1d6SQRg= @@ -350,7 +348,6 @@ github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYE github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= github.com/bufbuild/protovalidate-go v0.2.1 h1:pJr07sYhliyfj/STAM7hU4J3FKpVeLVKvOBmOTN8j+s= -github.com/bufbuild/protovalidate-go v0.2.1/go.mod h1:e7XXDtlxj5vlEyAgsrxpzayp4cEMKCSSb8ZCkin+MVA= github.com/bwesterb/go-ristretto v1.2.3 h1:1w53tCkGhCQ5djbat3+MH0BAQ5Kfgbt56UZQ/JMzngw= github.com/bytedance/sonic v1.10.0-rc3 h1:uNSnscRapXTwUgTyOF0GVljYD08p9X/Lbr9MweSV3V0= github.com/bytedance/sonic v1.10.0-rc3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= @@ -452,7 +449,6 @@ github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 h1:DddqAaWDpywytcG8w/qoQ5sAN8X12d3Z3koB0C3Rxsc= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= @@ -575,7 +571,6 @@ github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1 github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hamba/avro/v2 v2.17.2 h1:6PKpEWzJfNnvBgn7m2/8WYaDOUASxfDU+Jyb4ojDgFY= -github.com/hamba/avro/v2 v2.17.2/go.mod h1:Q9YK+qxAhtVrNqOhwlZTATLgLA8qxG2vtvkhK8fJ7Jo= github.com/hanwen/go-fuse v1.0.0 h1:GxS9Zrn6c35/BnfiVsZVWmsG803xwE7eVRDvcf/BEVc= github.com/hanwen/go-fuse/v2 v2.1.0 h1:+32ffteETaLYClUj0a3aHjZ1hOPxxaNEHiZiujuDaek= github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= @@ -793,7 +788,6 @@ github.com/phpdave11/gofpdi v1.0.13 h1:o61duiW8M9sMlkVXWlvP92sZJtGKENvW3VExs6dZu github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= github.com/pkg/profile v1.2.1 h1:F++O52m40owAmADcojzM+9gyjmMOY/T4oYJkgFDH8RE= -github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/pkg/sftp v1.13.1 h1:I2qBYMChEhIjOgazfJmV3/mZM256btk6wkCDRmW7JYs= github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= @@ -857,13 +851,9 @@ github.com/tdewolff/minify/v2 v2.12.9/go.mod h1:qOqdlDfL+7v0/fyymB+OP497nIxJYSvX github.com/tdewolff/parse/v2 v2.6.8 h1:mhNZXYCx//xG7Yq2e/kVLNZw4YfYmeHbhx+Zc0OvFMA= github.com/tdewolff/parse/v2 v2.6.8/go.mod h1:XHDhaU6IBgsryfdnpzUXBlT6leW/l25yrFBTEb4eIyM= github.com/tidwall/gjson v1.14.2 h1:6BBkirS0rAHjumnjHF6qgy5d2YAJ1TLIaFE2lzfOLqo= -github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= -github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= @@ -947,6 +937,7 @@ go.opentelemetry.io/collector/semconv v0.90.1 h1:2fkQZbefQBbIcNb9Rk1mRcWlFZgQOk7 go.opentelemetry.io/collector/semconv v0.98.0 h1:zO4L4TmlxXoYu8UgPeYElGY19BW7wPjM+quL5CzoOoY= go.opentelemetry.io/contrib v0.18.0 h1:uqBh0brileIvG6luvBjdxzoFL8lxDGuhxJWsvK3BveI= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0/go.mod h1:5z+/ZWJQKXa9YT34fQNx5K8Hd1EoIhvtUygUQPqEOgQ= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1/go.mod h1:GnOaBaFQ2we3b9AGWJpsBa7v1S5RlQzlC3O7dRMxZhM= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0/go.mod h1:tIKj3DbO8N9Y2xo52og3irLsPI4GW02DSMtrVgNMgxg= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1/go.mod h1:GnOaBaFQ2we3b9AGWJpsBa7v1S5RlQzlC3O7dRMxZhM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0/go.mod h1:rdENBZMT2OE6Ne/KLwpiXudnAsbdrdBaqBvTN8M8BgA= @@ -978,6 +969,9 @@ golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8U golang.org/x/image v0.0.0-20220302094943-723b81ca9867 h1:TcHcE0vrmgzNH1v3ppjcMGbhG5+9fMuvOmUYwNEF4q4= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808 h1:+Kc94D8UVEVxJnLXp/+FMfqQARZtWHfVrcRtcG8aT3g= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= +gonum.org/v1/plot v0.10.1 h1:dnifSs43YJuNMDzB7v8wV64O4ABBHReuAVAoBxqBqS4= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= gonum.org/v1/plot v0.10.1 h1:dnifSs43YJuNMDzB7v8wV64O4ABBHReuAVAoBxqBqS4= diff --git a/pkg/apiserver/go.mod b/pkg/apiserver/go.mod index b7e74ef4d71..e35256aa835 100644 --- a/pkg/apiserver/go.mod +++ b/pkg/apiserver/go.mod @@ -5,7 +5,7 @@ go 1.21.10 require ( github.com/bwmarrin/snowflake v0.3.0 github.com/gorilla/mux v1.8.1 - github.com/grafana/grafana-plugin-sdk-go v0.232.0 + github.com/grafana/grafana-plugin-sdk-go v0.234.0 github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240409140820-518d3341d58f github.com/prometheus/client_golang v1.19.0 github.com/stretchr/testify v1.9.0 @@ -74,6 +74,7 @@ require ( github.com/jonboulle/clockwork v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 // indirect github.com/klauspost/compress v1.17.8 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/magefile/mage v1.15.0 // indirect diff --git a/pkg/apiserver/go.sum b/pkg/apiserver/go.sum index e308f4cc48b..62e4e7b74ac 100644 --- a/pkg/apiserver/go.sum +++ b/pkg/apiserver/go.sum @@ -123,7 +123,7 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/grafana-plugin-sdk-go v0.232.0 h1:RnaQwhAOxYdp9wwy0Yz5cJUGY5tpIXPxoFWmEKflfww= +github.com/grafana/grafana-plugin-sdk-go v0.234.0 h1:p20XfGKB3Z/8aZ6jut+FIU/0cXw+dLkcGFnxJbyFd+k= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240409140820-518d3341d58f h1:+CK3tH3XrAAqx5urmVqpgSxMrL2MlpTOnLVSU4w4IjY= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240409140820-518d3341d58f/go.mod h1:ZxIaCOlDmFupiL55aLU+Qp7O1dgwkDMBAQBK7wnEVBg= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= @@ -154,6 +154,7 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 h1:SwcnSwBR7X/5EHJQlXBockkJVIMRVt5yKaesBPMtyZQ= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= diff --git a/pkg/expr/reader.go b/pkg/expr/reader.go index 71a75c6cb85..871e869d8a7 100644 --- a/pkg/expr/reader.go +++ b/pkg/expr/reader.go @@ -4,13 +4,13 @@ import ( "fmt" "strings" + "github.com/grafana/grafana-plugin-sdk-go/backend/gtime" "github.com/grafana/grafana-plugin-sdk-go/data/utils/jsoniter" data "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1" "github.com/grafana/grafana/pkg/expr/classic" "github.com/grafana/grafana/pkg/expr/mathexp" "github.com/grafana/grafana/pkg/services/featuremgmt" - "github.com/grafana/grafana/pkg/tsdb/legacydata" ) // Once we are comfortable with the parsing logic, this struct will @@ -101,7 +101,7 @@ func (h *ExpressionQueryReader) ReadQuery( referenceVar, err = getReferenceVar(q.Expression, common.RefID) } if err == nil { - tr := legacydata.NewDataTimeRange(common.TimeRange.From, common.TimeRange.To) + tr := gtime.NewTimeRange(common.TimeRange.From, common.TimeRange.To) eq.Properties = q eq.Command, err = NewResampleCommand(common.RefID, q.Window, diff --git a/pkg/extensions/main.go b/pkg/extensions/main.go index d9a36ab6d18..d8a77059cdd 100644 --- a/pkg/extensions/main.go +++ b/pkg/extensions/main.go @@ -28,7 +28,6 @@ import ( _ "github.com/robfig/cron/v3" _ "github.com/russellhaering/goxmldsig" _ "github.com/stretchr/testify/require" - _ "github.com/vectordotdev/go-datemath" _ "golang.org/x/time/rate" _ "xorm.io/builder" ) diff --git a/pkg/promlib/go.mod b/pkg/promlib/go.mod index c4da42e01a4..528ead5d2a0 100644 --- a/pkg/promlib/go.mod +++ b/pkg/promlib/go.mod @@ -3,7 +3,7 @@ module github.com/grafana/grafana/pkg/promlib go 1.21.10 require ( - github.com/grafana/grafana-plugin-sdk-go v0.232.0 + github.com/grafana/grafana-plugin-sdk-go v0.234.0 github.com/json-iterator/go v1.1.12 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/prometheus/client_golang v1.19.0 @@ -62,6 +62,7 @@ require ( github.com/invopop/jsonschema v0.12.0 // indirect github.com/invopop/yaml v0.2.0 // indirect github.com/josharian/intern v1.0.0 // indirect + github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 // indirect github.com/klauspost/compress v1.17.8 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/magefile/mage v1.15.0 // indirect diff --git a/pkg/promlib/go.sum b/pkg/promlib/go.sum index 2dcb6cb229f..d388dabf201 100644 --- a/pkg/promlib/go.sum +++ b/pkg/promlib/go.sum @@ -86,7 +86,7 @@ github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1 github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/grafana/grafana-plugin-sdk-go v0.232.0 h1:RnaQwhAOxYdp9wwy0Yz5cJUGY5tpIXPxoFWmEKflfww= +github.com/grafana/grafana-plugin-sdk-go v0.234.0 h1:p20XfGKB3Z/8aZ6jut+FIU/0cXw+dLkcGFnxJbyFd+k= github.com/grafana/regexp v0.0.0-20221123153739-15dc172cd2db h1:7aN5cccjIqCLTzedH7MZzRZt5/lsAHch6Z3L2ZGn5FA= github.com/grafana/regexp v0.0.0-20221123153739-15dc172cd2db/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= @@ -111,6 +111,7 @@ github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2E github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 h1:SwcnSwBR7X/5EHJQlXBockkJVIMRVt5yKaesBPMtyZQ= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= diff --git a/pkg/registry/apis/datasource/sub_query.go b/pkg/registry/apis/datasource/sub_query.go index cc6d0edc22a..eb88ab41843 100644 --- a/pkg/registry/apis/datasource/sub_query.go +++ b/pkg/registry/apis/datasource/sub_query.go @@ -11,7 +11,6 @@ import ( "k8s.io/apiserver/pkg/registry/rest" query "github.com/grafana/grafana/pkg/apis/query/v0alpha1" - "github.com/grafana/grafana/pkg/tsdb/legacydata" "github.com/grafana/grafana/pkg/web" ) @@ -62,7 +61,7 @@ func (r *subQueryREST) Connect(ctx context.Context, name string, opts runtime.Ob return } - queries, dsRef, err := legacydata.ToDataSourceQueries(dqr) + queries, dsRef, err := data.ToDataSourceQueries(dqr) if err != nil { responder.Error(err) return diff --git a/pkg/registry/apis/query/client/plugin.go b/pkg/registry/apis/query/client/plugin.go index 6e842f7ac45..bf97b9b486f 100644 --- a/pkg/registry/apis/query/client/plugin.go +++ b/pkg/registry/apis/query/client/plugin.go @@ -18,7 +18,6 @@ import ( "github.com/grafana/grafana/pkg/services/pluginsintegration/plugincontext" "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" "github.com/grafana/grafana/pkg/setting" - "github.com/grafana/grafana/pkg/tsdb/legacydata" ) type pluginClient struct { @@ -59,7 +58,7 @@ func NewDataSourceRegistryFromStore(pluginStore pluginstore.Store, // ExecuteQueryData implements QueryHelper. func (d *pluginClient) QueryData(ctx context.Context, req data.QueryDataRequest) (int, *backend.QueryDataResponse, error) { - queries, dsRef, err := legacydata.ToDataSourceQueries(req) + queries, dsRef, err := data.ToDataSourceQueries(req) if err != nil { return http.StatusBadRequest, nil, err } diff --git a/pkg/registry/apis/query/client/testdata.go b/pkg/registry/apis/query/client/testdata.go index b64169e4e07..16aba9469e6 100644 --- a/pkg/registry/apis/query/client/testdata.go +++ b/pkg/registry/apis/query/client/testdata.go @@ -13,7 +13,6 @@ import ( query "github.com/grafana/grafana/pkg/apis/query/v0alpha1" testdata "github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource" - "github.com/grafana/grafana/pkg/tsdb/legacydata" ) type testdataDummy struct{} @@ -33,7 +32,7 @@ func NewTestDataRegistry() query.DataSourceApiServerRegistry { // ExecuteQueryData implements QueryHelper. func (d *testdataDummy) QueryData(ctx context.Context, req data.QueryDataRequest) (int, *backend.QueryDataResponse, error) { - queries, _, err := legacydata.ToDataSourceQueries(req) + queries, _, err := data.ToDataSourceQueries(req) if err != nil { return http.StatusBadRequest, nil, err } diff --git a/pkg/services/publicdashboards/service/query.go b/pkg/services/publicdashboards/service/query.go index 5c9465e279f..29df0b7546d 100644 --- a/pkg/services/publicdashboards/service/query.go +++ b/pkg/services/publicdashboards/service/query.go @@ -6,6 +6,7 @@ import ( "time" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/backend/gtime" "github.com/grafana/grafana/pkg/api/dtos" "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/expr" @@ -18,7 +19,6 @@ import ( "github.com/grafana/grafana/pkg/services/publicdashboards/validation" "github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/tsdb/grafanads" - "github.com/grafana/grafana/pkg/tsdb/legacydata" ) // FindAnnotations returns annotations for a public dashboard @@ -368,20 +368,20 @@ func sanitizeData(data *simplejson.Json) { } } -// NewDataTimeRange declared to be able to stub this function in tests -var NewDataTimeRange = legacydata.NewDataTimeRange +// NewTimeRange declared to be able to stub this function in tests +var NewTimeRange = gtime.NewTimeRange // BuildTimeSettings build time settings object using selected values if enabled and are valid or dashboard default values func buildTimeSettings(d *dashboards.Dashboard, reqDTO models.PublicDashboardQueryDTO, pd *models.PublicDashboard) models.TimeSettings { from, to, timezone := getTimeRangeValuesOrDefault(reqDTO, d, pd.TimeSelectionEnabled) - timeRange := NewDataTimeRange(from, to) + timeRange := NewTimeRange(from, to) timeFrom, _ := timeRange.ParseFrom( - legacydata.WithLocation(timezone), + gtime.WithLocation(timezone), ) timeTo, _ := timeRange.ParseTo( - legacydata.WithLocation(timezone), + gtime.WithLocation(timezone), ) timeToAsEpoch := timeTo.UnixMilli() timeFromAsEpoch := timeFrom.UnixMilli() diff --git a/pkg/services/publicdashboards/service/query_test.go b/pkg/services/publicdashboards/service/query_test.go index b53bb878603..7a356effc7b 100644 --- a/pkg/services/publicdashboards/service/query_test.go +++ b/pkg/services/publicdashboards/service/query_test.go @@ -8,6 +8,7 @@ import ( "time" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/backend/gtime" "github.com/grafana/grafana-plugin-sdk-go/data" "github.com/grafana/grafana/pkg/components/simplejson" @@ -23,7 +24,6 @@ import ( "github.com/grafana/grafana/pkg/services/query" "github.com/grafana/grafana/pkg/services/quota/quotatest" "github.com/grafana/grafana/pkg/services/tag/tagimpl" - "github.com/grafana/grafana/pkg/tsdb/legacydata" "github.com/grafana/grafana/pkg/util" "github.com/stretchr/testify/assert" @@ -1616,8 +1616,8 @@ func TestBuildTimeSettings(t *testing.T) { fakeNow := time.Date(2018, 12, 9, 20, 30, 0, 0, fakeTimezone) // stub time range construction to have a fixed time.Now and be able to tests relative time ranges - NewDataTimeRange = func(from, to string) legacydata.DataTimeRange { - return legacydata.DataTimeRange{ + NewTimeRange = func(from, to string) gtime.TimeRange { + return gtime.TimeRange{ From: from, To: to, Now: fakeNow, diff --git a/pkg/services/publicdashboards/service/service.go b/pkg/services/publicdashboards/service/service.go index 4df8e849cd1..31a107f26c7 100644 --- a/pkg/services/publicdashboards/service/service.go +++ b/pkg/services/publicdashboards/service/service.go @@ -8,6 +8,7 @@ import ( "github.com/google/uuid" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/backend/gtime" "github.com/grafana/grafana/pkg/api/dtos" "github.com/grafana/grafana/pkg/infra/log" @@ -24,7 +25,6 @@ import ( "github.com/grafana/grafana/pkg/services/query" "github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/setting" - "github.com/grafana/grafana/pkg/tsdb/legacydata" "github.com/grafana/grafana/pkg/util" ) @@ -420,7 +420,7 @@ func (pd *PublicDashboardServiceImpl) getSafeIntervalAndMaxDataPoints(reqDTO Pub interval := time.Duration(reqDTO.IntervalMs) * time.Millisecond // calculate a safe interval with time range from dashboard and safeResolution - dataTimeRange := legacydata.NewDataTimeRange(ts.From, ts.To) + dataTimeRange := gtime.NewTimeRange(ts.From, ts.To) tr := backend.TimeRange{ From: dataTimeRange.GetFromAsTimeUTC(), To: dataTimeRange.GetToAsTimeUTC(), diff --git a/pkg/services/publicdashboards/validation/validation.go b/pkg/services/publicdashboards/validation/validation.go index b48c6628b31..31823274e92 100644 --- a/pkg/services/publicdashboards/validation/validation.go +++ b/pkg/services/publicdashboards/validation/validation.go @@ -2,8 +2,8 @@ package validation import ( "github.com/google/uuid" + "github.com/grafana/grafana-plugin-sdk-go/backend/gtime" . "github.com/grafana/grafana/pkg/services/publicdashboards/models" - "github.com/grafana/grafana/pkg/tsdb/legacydata" "github.com/grafana/grafana/pkg/util" ) @@ -26,7 +26,7 @@ func ValidateQueryPublicDashboardRequest(req PublicDashboardQueryDTO, pd *Public } if pd.TimeSelectionEnabled { - timeRange := legacydata.NewDataTimeRange(req.TimeRange.From, req.TimeRange.To) + timeRange := gtime.NewTimeRange(req.TimeRange.From, req.TimeRange.To) _, err := timeRange.ParseFrom() if err != nil { diff --git a/pkg/services/query/query.go b/pkg/services/query/query.go index 34f2fabdee7..a5890dedb7a 100644 --- a/pkg/services/query/query.go +++ b/pkg/services/query/query.go @@ -9,6 +9,7 @@ import ( "time" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/backend/gtime" "golang.org/x/sync/errgroup" "github.com/grafana/grafana/pkg/api/dtos" @@ -23,7 +24,6 @@ import ( "github.com/grafana/grafana/pkg/services/validations" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/tsdb/grafanads" - "github.com/grafana/grafana/pkg/tsdb/legacydata" "github.com/grafana/grafana/pkg/util/errutil" ) @@ -277,7 +277,7 @@ func (s *ServiceImpl) parseMetricRequest(ctx context.Context, user identity.Requ return nil, ErrNoQueriesFound } - timeRange := legacydata.NewDataTimeRange(reqDTO.From, reqDTO.To) + timeRange := gtime.NewTimeRange(reqDTO.From, reqDTO.To) req := &parsedRequest{ hasExpression: false, parsedQueries: make(map[string][]parsedQuery), diff --git a/pkg/services/queryhistory/api.go b/pkg/services/queryhistory/api.go index 3b47185ced1..51bf07e6572 100644 --- a/pkg/services/queryhistory/api.go +++ b/pkg/services/queryhistory/api.go @@ -3,11 +3,11 @@ package queryhistory import ( "net/http" + "github.com/grafana/grafana-plugin-sdk-go/backend/gtime" "github.com/grafana/grafana/pkg/api/response" "github.com/grafana/grafana/pkg/api/routing" "github.com/grafana/grafana/pkg/middleware" contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model" - "github.com/grafana/grafana/pkg/tsdb/legacydata" "github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/web" ) @@ -61,7 +61,7 @@ func (s *QueryHistoryService) createHandler(c *contextmodel.ReqContext) response // 401: unauthorisedError // 500: internalServerError func (s *QueryHistoryService) searchHandler(c *contextmodel.ReqContext) response.Response { - timeRange := legacydata.NewDataTimeRange(c.Query("from"), c.Query("to")) + timeRange := gtime.NewTimeRange(c.Query("from"), c.Query("to")) query := SearchInQueryHistoryQuery{ DatasourceUIDs: c.QueryStrings("datasourceUid"), diff --git a/pkg/tsdb/legacydata/conversions.go b/pkg/tsdb/legacydata/conversions.go deleted file mode 100644 index 4ca7322f9e8..00000000000 --- a/pkg/tsdb/legacydata/conversions.go +++ /dev/null @@ -1,84 +0,0 @@ -package legacydata - -import ( - "encoding/json" - "fmt" - "time" - - "github.com/grafana/grafana-plugin-sdk-go/backend" - data "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1" -) - -// ToDataSourceQueries returns queries that should be sent to a single datasource -// This will throw an error if the queries reference multiple instances -func ToDataSourceQueries(req data.QueryDataRequest) ([]backend.DataQuery, *data.DataSourceRef, error) { - var dsRef *data.DataSourceRef - var tr *backend.TimeRange - if req.From != "" { - val := NewDataTimeRange(req.From, req.To) - tr = &backend.TimeRange{ - From: val.GetFromAsTimeUTC(), - To: val.GetToAsTimeUTC(), - } - } - - queries := []backend.DataQuery{} - if len(req.Queries) > 0 { - dsRef := req.Queries[0].Datasource - for _, generic := range req.Queries { - if generic.Datasource != nil && dsRef != nil { - if dsRef.Type != generic.Datasource.Type { - return queries, dsRef, fmt.Errorf("expect same datasource types") - } - if dsRef.UID != generic.Datasource.UID { - return queries, dsRef, fmt.Errorf("expect same datasource UID") - } - } - q, err := toBackendDataQuery(generic, tr) - if err != nil { - return queries, dsRef, err - } - queries = append(queries, q) - } - return queries, dsRef, nil - } - return queries, dsRef, nil -} - -// Converts a generic query to a backend one -func toBackendDataQuery(q data.DataQuery, defaultTimeRange *backend.TimeRange) (backend.DataQuery, error) { - var err error - bq := backend.DataQuery{ - RefID: q.RefID, - QueryType: q.QueryType, - MaxDataPoints: q.MaxDataPoints, - } - - // Set an explicit time range for the query - if q.TimeRange != nil { - tr := NewDataTimeRange(q.TimeRange.From, q.TimeRange.To) - bq.TimeRange = backend.TimeRange{ - From: tr.GetFromAsTimeUTC(), - To: tr.GetToAsTimeUTC(), - } - } else if defaultTimeRange != nil { - bq.TimeRange = *defaultTimeRange - } - - bq.JSON, err = json.Marshal(q) - if err != nil { - return bq, err - } - if bq.RefID == "" { - bq.RefID = "A" - } - if bq.MaxDataPoints == 0 { - bq.MaxDataPoints = 100 - } - if q.IntervalMS > 0 { - bq.Interval = time.Millisecond * time.Duration(q.IntervalMS) - } else { - bq.Interval = time.Second - } - return bq, nil -} diff --git a/pkg/tsdb/legacydata/doc.go b/pkg/tsdb/legacydata/doc.go deleted file mode 100644 index 362f9744443..00000000000 --- a/pkg/tsdb/legacydata/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package legacydata contains old/legacy interfaces/contracts that uses a data format of series/tables. -// Deprecated: use github.com/grafana/grafana-plugin-sdk-go/backend instead. -package legacydata diff --git a/pkg/tsdb/legacydata/time_range.go b/pkg/tsdb/legacydata/time_range.go deleted file mode 100644 index 9f24e806bfe..00000000000 --- a/pkg/tsdb/legacydata/time_range.go +++ /dev/null @@ -1,175 +0,0 @@ -package legacydata - -import ( - "strconv" - "time" - - "github.com/vectordotdev/go-datemath" -) - -type DataTimeRange struct { - From string - To string - Now time.Time -} - -func NewDataTimeRange(from, to string) DataTimeRange { - return DataTimeRange{ - From: from, - To: to, - Now: time.Now(), - } -} - -func (tr DataTimeRange) GetFromAsMsEpoch() int64 { - return tr.MustGetFrom().UnixNano() / int64(time.Millisecond) -} - -func (tr DataTimeRange) GetFromAsSecondsEpoch() int64 { - return tr.GetFromAsMsEpoch() / 1000 -} - -func (tr DataTimeRange) GetFromAsTimeUTC() time.Time { - return tr.MustGetFrom().UTC() -} - -func (tr DataTimeRange) GetToAsMsEpoch() int64 { - return tr.MustGetTo().UnixNano() / int64(time.Millisecond) -} - -func (tr DataTimeRange) GetToAsSecondsEpoch() int64 { - return tr.GetToAsMsEpoch() / 1000 -} - -func (tr DataTimeRange) GetToAsTimeUTC() time.Time { - return tr.MustGetTo().UTC() -} - -func (tr DataTimeRange) MustGetFrom() time.Time { - res, err := tr.ParseFrom() - if err != nil { - return time.Unix(0, 0) - } - return res -} - -func (tr DataTimeRange) MustGetTo() time.Time { - res, err := tr.ParseTo() - if err != nil { - return time.Unix(0, 0) - } - return res -} - -func (tr DataTimeRange) ParseFrom(options ...TimeRangeOption) (time.Time, error) { - options = append(options, WithNow(tr.Now)) - - pt := newParsableTime(tr.From, options...) - return pt.Parse() -} - -func (tr DataTimeRange) ParseTo(options ...TimeRangeOption) (time.Time, error) { - options = append(options, WithRoundUp(), WithNow(tr.Now)) - - pt := newParsableTime(tr.To, options...) - return pt.Parse() -} - -func WithWeekstart(weekday time.Weekday) TimeRangeOption { - return func(timeRange parsableTime) parsableTime { - timeRange.weekstart = &weekday - return timeRange - } -} - -func WithLocation(loc *time.Location) TimeRangeOption { - return func(timeRange parsableTime) parsableTime { - timeRange.location = loc - return timeRange - } -} - -func WithFiscalStartMonth(month time.Month) TimeRangeOption { - return func(timeRange parsableTime) parsableTime { - timeRange.fiscalStartMonth = &month - return timeRange - } -} - -func WithNow(t time.Time) TimeRangeOption { - return func(timeRange parsableTime) parsableTime { - timeRange.now = t - return timeRange - } -} - -func WithRoundUp() TimeRangeOption { - return func(timeRange parsableTime) parsableTime { - timeRange.roundUp = true - return timeRange - } -} - -type parsableTime struct { - time string - now time.Time - location *time.Location - weekstart *time.Weekday - fiscalStartMonth *time.Month - roundUp bool -} - -type TimeRangeOption func(timeRange parsableTime) parsableTime - -func newParsableTime(t string, options ...TimeRangeOption) parsableTime { - p := parsableTime{ - time: t, - now: time.Now(), - } - - for _, opt := range options { - p = opt(p) - } - - return p -} - -func (t parsableTime) Parse() (time.Time, error) { - // Milliseconds since Unix epoch. - if val, err := strconv.ParseInt(t.time, 10, 64); err == nil { - return time.UnixMilli(val), nil - } - - // Duration relative to current time. - if diff, err := time.ParseDuration("-" + t.time); err == nil { - return t.now.Add(diff), nil - } - - // Advanced time string, mimics the frontend's datemath library. - return datemath.ParseAndEvaluate(t.time, t.datemathOptions()...) -} - -func (t parsableTime) datemathOptions() []func(*datemath.Options) { - options := []func(*datemath.Options){ - datemath.WithNow(t.now), - datemath.WithRoundUp(t.roundUp), - } - if t.location != nil { - options = append(options, datemath.WithLocation(t.location)) - } - if t.weekstart != nil { - options = append(options, datemath.WithStartOfWeek(*t.weekstart)) - } - if t.fiscalStartMonth != nil { - loc := time.UTC - if t.location != nil { - loc = t.location - } - options = append(options, datemath.WithStartOfFiscalYear( - // Year doesn't matter, and Grafana only supports setting the - // month that the fiscal year starts in. - time.Date(0, *t.fiscalStartMonth, 1, 0, 0, 0, 0, loc), - )) - } - return options -} diff --git a/pkg/tsdb/legacydata/time_range_test.go b/pkg/tsdb/legacydata/time_range_test.go deleted file mode 100644 index 3837f35014d..00000000000 --- a/pkg/tsdb/legacydata/time_range_test.go +++ /dev/null @@ -1,389 +0,0 @@ -package legacydata - -import ( - "strconv" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestTimeRange(t *testing.T) { - now := time.Now() - - t.Run("Can parse 5m, now", func(t *testing.T) { - tr := DataTimeRange{ - From: "5m", - To: "now", - Now: now, - } - - t.Run("5m ago ", func(t *testing.T) { - fiveMinAgo, err := time.ParseDuration("-5m") - require.Nil(t, err) - expected := now.Add(fiveMinAgo) - - res, err := tr.ParseFrom() - require.Nil(t, err) - require.Equal(t, expected.Unix(), res.Unix()) - }) - - t.Run("now ", func(t *testing.T) { - res, err := tr.ParseTo() - require.Nil(t, err) - require.Equal(t, now.Unix(), res.Unix()) - }) - }) - - t.Run("Can parse 5h, now-10m", func(t *testing.T) { - tr := DataTimeRange{ - From: "5h", - To: "now-10m", - Now: now, - } - - t.Run("5h ago ", func(t *testing.T) { - fiveHourAgo, err := time.ParseDuration("-5h") - require.Nil(t, err) - expected := now.Add(fiveHourAgo) - - res, err := tr.ParseFrom() - require.Nil(t, err) - require.Equal(t, expected.Unix(), res.Unix()) - }) - - t.Run("now-10m ", func(t *testing.T) { - tenMinAgo, err := time.ParseDuration("-10m") - require.Nil(t, err) - expected := now.Add(tenMinAgo) - res, err := tr.ParseTo() - require.Nil(t, err) - require.Equal(t, expected.Unix(), res.Unix()) - }) - }) - - now, err := time.Parse(time.RFC3339Nano, "2020-03-26T15:12:56.000Z") - require.Nil(t, err) - t.Run("Can parse now-1M/M, now-1M/M", func(t *testing.T) { - tr := DataTimeRange{ - From: "now-1M/M", - To: "now-1M/M", - Now: now, - } - - t.Run("from now-1M/M ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-02-01T00:00:00.000Z") - require.Nil(t, err) - - res, err := tr.ParseFrom() - require.Nil(t, err) - require.Equal(t, expected, res) - }) - - t.Run("to now-1M/M ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-02-29T23:59:59.999Z") - require.Nil(t, err) - - res, err := tr.ParseTo() - require.Nil(t, err) - require.Equal(t, expected, res) - }) - }) - - t.Run("Can parse now-3d, now+3w", func(t *testing.T) { - tr := DataTimeRange{ - From: "now-3d", - To: "now+3w", - Now: now, - } - - t.Run("now-3d ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-03-23T15:12:56.000Z") - require.Nil(t, err) - - res, err := tr.ParseFrom() - require.Nil(t, err) - require.Equal(t, expected, res) - }) - - t.Run("now+3w ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-04-16T15:12:56.000Z") - require.Nil(t, err) - - res, err := tr.ParseTo() - require.Nil(t, err) - require.Equal(t, expected, res) - }) - }) - - t.Run("Can parse now/fy, now/fQ for 1994-02-26T14:00:00.000Z with fiscal year starting in July", func(t *testing.T) { - tr := DataTimeRange{ - From: "now/fy", - To: "now/fQ", - Now: time.Date(1994, time.February, 26, 14, 0, 0, 0, time.UTC), - } - - start, err := tr.ParseFrom(WithFiscalStartMonth(time.July)) - require.NoError(t, err) - assert.Equal( - t, - time.Date(1993, time.July, 1, 0, 0, 0, 0, time.UTC), - start, - ) - - end, err := tr.ParseTo(WithFiscalStartMonth(time.July)) - require.NoError(t, err) - assert.Equal( - t, - time.Date(1994, time.April, 1, 0, 0, 0, 0, time.UTC).Add(-time.Millisecond), - end, - ) - }) - - t.Run("Can parse 1960-02-01T07:00:00.000Z, 1965-02-03T08:00:00.000Z", func(t *testing.T) { - tr := DataTimeRange{ - From: "1960-02-01T07:00:00.000Z", - To: "1965-02-03T08:00:00.000Z", - Now: now, - } - - t.Run("1960-02-01T07:00:00.000Z ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "1960-02-01T07:00:00.000Z") - require.Nil(t, err) - - res, err := tr.ParseFrom() - require.Nil(t, err) - require.Equal(t, expected, res) - }) - - t.Run("1965-02-03T08:00:00.000Z ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "1965-02-03T08:00:00.000Z") - require.Nil(t, err) - - res, err := tr.ParseTo() - require.Nil(t, err) - require.Equal(t, expected, res) - }) - }) - - t.Run("Can parse negative unix epochs", func(t *testing.T) { - from := time.Date(1960, 2, 1, 7, 0, 0, 0, time.UTC) - to := time.Date(1965, 2, 3, 8, 0, 0, 0, time.UTC) - tr := NewDataTimeRange(strconv.FormatInt(from.UnixNano()/int64(time.Millisecond), 10), strconv.FormatInt(to.UnixNano()/int64(time.Millisecond), 10)) - - res, err := tr.ParseFrom() - require.Nil(t, err) - require.True(t, from.Equal(res)) - - res, err = tr.ParseTo() - require.Nil(t, err) - require.True(t, to.Equal(res)) - }) - - t.Run("can parse unix epochs", func(t *testing.T) { - var err error - tr := DataTimeRange{ - From: "1474973725473", - To: "1474975757930", - Now: now, - } - - res, err := tr.ParseFrom() - require.Nil(t, err) - require.Equal(t, int64(1474973725473), res.UnixNano()/int64(time.Millisecond)) - - res, err = tr.ParseTo() - require.Nil(t, err) - require.Equal(t, int64(1474975757930), res.UnixNano()/int64(time.Millisecond)) - }) - - t.Run("Cannot parse asdf", func(t *testing.T) { - var err error - tr := DataTimeRange{ - From: "asdf", - To: "asdf", - Now: now, - } - - _, err = tr.ParseFrom() - require.Error(t, err) - - _, err = tr.ParseTo() - require.Error(t, err) - }) - - now, err = time.Parse(time.RFC3339Nano, "2020-07-26T15:12:56.000Z") - require.Nil(t, err) - - t.Run("Can parse now-1M/M, now-1M/M with America/Chicago timezone", func(t *testing.T) { - tr := DataTimeRange{ - From: "now-1M/M", - To: "now-1M/M", - Now: now, - } - location, err := time.LoadLocation("America/Chicago") - require.Nil(t, err) - - t.Run("from now-1M/M ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-06-01T00:00:00.000-05:00") - require.Nil(t, err) - - res, err := tr.ParseFrom(WithLocation(location)) - require.Nil(t, err) - require.True(t, expected.Equal(res)) - }) - - t.Run("to now-1M/M ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-06-30T23:59:59.999-05:00") - require.Nil(t, err) - - res, err := tr.ParseTo(WithLocation(location)) - require.Nil(t, err) - require.True(t, expected.Equal(res)) - }) - }) - - t.Run("Can parse now-3h, now+2h with America/Chicago timezone", func(t *testing.T) { - tr := DataTimeRange{ - From: "now-3h", - To: "now+2h", - Now: now, - } - location, err := time.LoadLocation("America/Chicago") - require.Nil(t, err) - - t.Run("now-3h ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-07-26T07:12:56.000-05:00") - require.Nil(t, err) - - res, err := tr.ParseFrom(WithLocation(location)) - require.Nil(t, err) - require.True(t, expected.Equal(res)) - }) - - t.Run("now+2h ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-07-26T12:12:56.000-05:00") - require.Nil(t, err) - - res, err := tr.ParseTo(WithLocation(location)) - require.Nil(t, err) - require.True(t, expected.Equal(res)) - }) - }) - - t.Run("Can parse now-1w/w, now-1w/w without timezone and week start on Monday", func(t *testing.T) { - tr := DataTimeRange{ - From: "now-1w/w", - To: "now-1w/w", - Now: now, - } - weekstart := time.Monday - require.Nil(t, err) - - t.Run("from now-1w/w ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-07-13T00:00:00.000Z") - require.Nil(t, err) - - res, err := tr.ParseFrom(WithWeekstart(weekstart)) - require.Nil(t, err) - require.True(t, expected.Equal(res)) - }) - - t.Run("to now-1w/w ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-07-19T23:59:59.999Z") - require.Nil(t, err) - - res, err := tr.ParseTo(WithWeekstart(weekstart)) - require.Nil(t, err) - require.True(t, expected.Equal(res)) - }) - }) - - t.Run("Can parse now-1w/w, now-1w/w with America/Chicago timezone and week start on Monday", func(t *testing.T) { - tr := DataTimeRange{ - From: "now-1w/w", - To: "now-1w/w", - Now: now, - } - weekstart := time.Monday - location, err := time.LoadLocation("America/Chicago") - require.Nil(t, err) - - t.Run("from now-1w/w ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-07-13T00:00:00.000-05:00") - require.Nil(t, err) - - res, err := tr.ParseFrom(WithLocation(location), WithWeekstart(weekstart)) - require.Nil(t, err) - require.True(t, expected.Equal(res)) - }) - - t.Run("to now-1w/w ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-07-19T23:59:59.999-05:00") - require.Nil(t, err) - - res, err := tr.ParseTo(WithLocation(location), WithWeekstart(weekstart)) - require.Nil(t, err) - require.True(t, expected.Equal(res)) - }) - }) - - t.Run("Can parse now-1w/w, now-1w/w with America/Chicago timezone and week start on Sunday", func(t *testing.T) { - tr := DataTimeRange{ - From: "now-1w/w", - To: "now-1w/w", - Now: now, - } - weekstart := time.Sunday - location, err := time.LoadLocation("America/Chicago") - require.Nil(t, err) - - t.Run("from now-1w/w ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-07-19T00:00:00.000-05:00") - require.Nil(t, err) - - res, err := tr.ParseFrom(WithLocation(location), WithWeekstart(weekstart)) - require.Nil(t, err) - require.True(t, expected.Equal(res)) - }) - - t.Run("to now-1w/w ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-07-25T23:59:59.999-05:00") - require.Nil(t, err) - - res, err := tr.ParseTo(WithLocation(location), WithWeekstart(weekstart)) - require.Nil(t, err) - require.True(t, expected.Equal(res)) - }) - }) - - t.Run("Can parse now-1w/w, now-1w/w with America/Chicago timezone and week start on Saturday", func(t *testing.T) { - tr := DataTimeRange{ - From: "now-1w/w", - To: "now-1w/w", - Now: now, - } - weekstart := time.Saturday - location, err := time.LoadLocation("America/Chicago") - require.Nil(t, err) - - t.Run("from now-1w/w ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-07-18T00:00:00.000-05:00") - require.Nil(t, err) - - res, err := tr.ParseFrom(WithLocation(location), WithWeekstart(weekstart)) - require.Nil(t, err) - require.True(t, expected.Equal(res)) - }) - - t.Run("to now-1w/w ", func(t *testing.T) { - expected, err := time.Parse(time.RFC3339Nano, "2020-07-24T23:59:59.999-05:00") - require.Nil(t, err) - - res, err := tr.ParseTo(WithLocation(location), WithWeekstart(weekstart)) - require.Nil(t, err) - require.True(t, expected.Equal(res)) - }) - }) -}