From ae77b7a99eea0afabbf6a9bb6de1ba598d0c672a Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Sat, 30 May 2020 19:52:31 -0700 Subject: [PATCH 01/22] eventlog-to-ot submodule for protobuf files --- .gitmodules | 3 +++ proto | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 proto diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..22bac53 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "proto"] + path = proto + url = /home/dan/demo/haskell/gsoc/tele-meta/opentelemetry-proto diff --git a/proto b/proto new file mode 160000 index 0000000..28e2774 --- /dev/null +++ b/proto @@ -0,0 +1 @@ +Subproject commit 28e2774262a651c4c2e701c3a05820c3e43ead71 From 6a11f24a4d56d8a91777c536ffb2860a4ad92031 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Sat, 30 May 2020 20:10:34 -0700 Subject: [PATCH 02/22] eventlog-to-ot proto lib --- opentelemetry-extra/proto/Setup.hs | 3 ++ .../proto/opentelemetry-proto.cabal | 48 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 opentelemetry-extra/proto/Setup.hs create mode 100644 opentelemetry-extra/proto/opentelemetry-proto.cabal diff --git a/opentelemetry-extra/proto/Setup.hs b/opentelemetry-extra/proto/Setup.hs new file mode 100644 index 0000000..0498b1c --- /dev/null +++ b/opentelemetry-extra/proto/Setup.hs @@ -0,0 +1,3 @@ +import Data.ProtoLens.Setup + +main = defaultMainGeneratingProtos "proto" diff --git a/opentelemetry-extra/proto/opentelemetry-proto.cabal b/opentelemetry-extra/proto/opentelemetry-proto.cabal new file mode 100644 index 0000000..4fcfb56 --- /dev/null +++ b/opentelemetry-extra/proto/opentelemetry-proto.cabal @@ -0,0 +1,48 @@ +cabal-version: 2.4 +name: opentelemetry-proto +description: OpenTelemetry Protobuf Data types +category: OpenTelemetry +version: 0.4.2 +license-file: LICENSE +license: Apache-2.0 +author: Dmitry Ivanov +maintainer: ethercrow@gmail.com +build-type: Custom + +source-repository head + type: git + location: https://github.com/ethercrow/opentelemetry-haskell + +common options + default-language: Haskell2010 + ghc-options: + -Wall + -Wcompat + -Widentities + -Wincomplete-record-updates + -Wincomplete-uni-patterns + -Wpartial-fields + -fhide-source-paths + -ferror-spans + -freverse-errors + +extra-source-files: + proto/person.proto + +custom-setup + setup-depends: + Cabal + , base + , proto-lens-setup + + +library + import: options + build-depends: + base >= 4.12 && < 5, + proto-lens-runtime + hs-source-dirs: src + exposed-modules: + Proto.OpenTelemetry.Common + other-modules: + Paths_opentelemetry-proto From 4417467ea3ec21125c76252fe12243648517c5f8 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Sat, 30 May 2020 20:11:02 -0700 Subject: [PATCH 03/22] eventlog-to-ot move proto repo --- .gitmodules | 2 +- proto => opentelemetry-extra/proto/proto | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename proto => opentelemetry-extra/proto/proto (100%) diff --git a/.gitmodules b/.gitmodules index 22bac53..5892b54 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "proto"] - path = proto + path = opentelemetry-extra/proto/proto url = /home/dan/demo/haskell/gsoc/tele-meta/opentelemetry-proto diff --git a/proto b/opentelemetry-extra/proto/proto similarity index 100% rename from proto rename to opentelemetry-extra/proto/proto From c9ad9ac2a11bc052096e6558fbbb6969594f59e9 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Sun, 31 May 2020 09:09:13 -0700 Subject: [PATCH 04/22] eventlog-to-ot opentelemetry proto types and marshals --- .gitmodules | 2 +- cabal.project | 2 +- .../exe/eventlog-to-opentelemetry/Main.hs | 31 +++++++++++++++++++ opentelemetry-extra/opentelemetry-extra.cabal | 12 +++++++ opentelemetry-proto/LICENSE | 7 +++++ .../proto => opentelemetry-proto}/Setup.hs | 0 .../opentelemetry-proto.cabal | 16 +++++++--- .../proto => opentelemetry-proto}/proto | 0 stack-8.10.1.yaml | 1 + stack.yaml | 1 + 10 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs create mode 100644 opentelemetry-proto/LICENSE rename {opentelemetry-extra/proto => opentelemetry-proto}/Setup.hs (100%) rename {opentelemetry-extra/proto => opentelemetry-proto}/opentelemetry-proto.cabal (64%) rename {opentelemetry-extra/proto => opentelemetry-proto}/proto (100%) diff --git a/.gitmodules b/.gitmodules index 5892b54..ccf11b0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "proto"] - path = opentelemetry-extra/proto/proto + path = opentelemetry-proto/proto url = /home/dan/demo/haskell/gsoc/tele-meta/opentelemetry-proto diff --git a/cabal.project b/cabal.project index f44a24c..de88d6a 100644 --- a/cabal.project +++ b/cabal.project @@ -1 +1 @@ -packages: */*.cabal +packages: **/*.cabal diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs new file mode 100644 index 0000000..d344c59 --- /dev/null +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs @@ -0,0 +1,31 @@ +{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-} + +module Main where + +import Data.ProtoLens (defMessage, showMessage) +import Data.ProtoLens.Encoding (encodeMessage, decodeMessageOrDie) + +import Data.ByteString as BS + +import Lens.Micro + +import Proto.Opentelemetry.Proto.Common.V1.Common as C +import Proto.Opentelemetry.Proto.Common.V1.Common_Fields as C +import Proto.Opentelemetry.Proto.Resource.V1.Resource as R +import Proto.Opentelemetry.Proto.Resource.V1.Resource_Fields as R +import Proto.Opentelemetry.Proto.Trace.V1.Trace as T +import Proto.Opentelemetry.Proto.Trace.V1.Trace_Fields as T + + +resource1 :: C.AttributeKeyValue +resource1 = + defMessage + & C.key .~ "Hello" + & C.type' .~ C.AttributeKeyValue'STRING + & C.stringValue .~ "World" + +main :: IO () +main = do + let msg :: C.AttributeKeyValue = decodeMessageOrDie . encodeMessage $ resource1 + BS.writeFile "person.bin" . encodeMessage $ resource1 + Prelude.putStrLn . showMessage $ msg & (C.stringValue .~ "99") diff --git a/opentelemetry-extra/opentelemetry-extra.cabal b/opentelemetry-extra/opentelemetry-extra.cabal index b1a3e52..5c8efde 100644 --- a/opentelemetry-extra/opentelemetry-extra.cabal +++ b/opentelemetry-extra/opentelemetry-extra.cabal @@ -159,3 +159,15 @@ executable eventlog-to-tracy build-depends: base, process, + +executable eventlog-to-opentelemetry + import: options + main-is: Main.hs + hs-source-dirs: exe/eventlog-to-opentelemetry + build-depends: + base, + bytestring, + microlens, + opentelemetry-proto, + proto-lens, + default-language: Haskell2010 \ No newline at end of file diff --git a/opentelemetry-proto/LICENSE b/opentelemetry-proto/LICENSE new file mode 100644 index 0000000..e2277b5 --- /dev/null +++ b/opentelemetry-proto/LICENSE @@ -0,0 +1,7 @@ +Copyright 2020-present Dmitry Ivanov + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. diff --git a/opentelemetry-extra/proto/Setup.hs b/opentelemetry-proto/Setup.hs similarity index 100% rename from opentelemetry-extra/proto/Setup.hs rename to opentelemetry-proto/Setup.hs diff --git a/opentelemetry-extra/proto/opentelemetry-proto.cabal b/opentelemetry-proto/opentelemetry-proto.cabal similarity index 64% rename from opentelemetry-extra/proto/opentelemetry-proto.cabal rename to opentelemetry-proto/opentelemetry-proto.cabal index 4fcfb56..5f3c76a 100644 --- a/opentelemetry-extra/proto/opentelemetry-proto.cabal +++ b/opentelemetry-proto/opentelemetry-proto.cabal @@ -8,6 +8,10 @@ license: Apache-2.0 author: Dmitry Ivanov maintainer: ethercrow@gmail.com build-type: Custom +extra-source-files: + proto/opentelemetry/proto/common/v1/common.proto + proto/opentelemetry/proto/resource/v1/resource.proto, + proto/opentelemetry/proto/trace/v1/trace.proto source-repository head type: git @@ -26,8 +30,6 @@ common options -ferror-spans -freverse-errors -extra-source-files: - proto/person.proto custom-setup setup-depends: @@ -41,8 +43,12 @@ library build-depends: base >= 4.12 && < 5, proto-lens-runtime - hs-source-dirs: src exposed-modules: - Proto.OpenTelemetry.Common + Proto.Opentelemetry.Proto.Common.V1.Common, + Proto.Opentelemetry.Proto.Common.V1.Common_Fields, + Proto.Opentelemetry.Proto.Resource.V1.Resource, + Proto.Opentelemetry.Proto.Resource.V1.Resource_Fields, + Proto.Opentelemetry.Proto.Trace.V1.Trace, + Proto.Opentelemetry.Proto.Trace.V1.Trace_Fields other-modules: - Paths_opentelemetry-proto + Paths_opentelemetry_proto diff --git a/opentelemetry-extra/proto/proto b/opentelemetry-proto/proto similarity index 100% rename from opentelemetry-extra/proto/proto rename to opentelemetry-proto/proto diff --git a/stack-8.10.1.yaml b/stack-8.10.1.yaml index b03fe0f..8c4bc56 100644 --- a/stack-8.10.1.yaml +++ b/stack-8.10.1.yaml @@ -5,6 +5,7 @@ packages: - opentelemetry - opentelemetry-extra - opentelemetry-lightstep +- opentelemetry-proto - opentelemetry-wai allow-newer: true diff --git a/stack.yaml b/stack.yaml index e6ce014..fbca5e4 100644 --- a/stack.yaml +++ b/stack.yaml @@ -5,6 +5,7 @@ packages: - opentelemetry - opentelemetry-extra - opentelemetry-lightstep +- opentelemetry-proto - opentelemetry-wai extra-deps: From 6d2b1c4aad84acc4355807bdee4b6568e1d1d6a0 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Sun, 31 May 2020 09:16:01 -0700 Subject: [PATCH 05/22] eventlog-to-ot opentelemetry-proto.git global url --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index ccf11b0..bb41324 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "proto"] path = opentelemetry-proto/proto - url = /home/dan/demo/haskell/gsoc/tele-meta/opentelemetry-proto + url = https://github.com/open-telemetry/opentelemetry-proto.git From daa2162e3a9d359510f04d5e33eca65e1c1e4b53 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Sun, 31 May 2020 09:16:21 -0700 Subject: [PATCH 06/22] eventlog-to-ot revert cabal pattern --- cabal.project | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cabal.project b/cabal.project index de88d6a..f44a24c 100644 --- a/cabal.project +++ b/cabal.project @@ -1 +1 @@ -packages: **/*.cabal +packages: */*.cabal From 318bee99e23bd46f9b94cb8681b2fd01cc70c686 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Sun, 31 May 2020 09:39:00 -0700 Subject: [PATCH 07/22] eventlog-to-ot disable eventlog-to-opentelemtry for ghc > 8.8 --- opentelemetry-extra/opentelemetry-extra.cabal | 24 ++++++++++--------- stack-8.10.1.yaml | 1 - 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/opentelemetry-extra/opentelemetry-extra.cabal b/opentelemetry-extra/opentelemetry-extra.cabal index 5c8efde..913e6ba 100644 --- a/opentelemetry-extra/opentelemetry-extra.cabal +++ b/opentelemetry-extra/opentelemetry-extra.cabal @@ -160,14 +160,16 @@ executable eventlog-to-tracy base, process, -executable eventlog-to-opentelemetry - import: options - main-is: Main.hs - hs-source-dirs: exe/eventlog-to-opentelemetry - build-depends: - base, - bytestring, - microlens, - opentelemetry-proto, - proto-lens, - default-language: Haskell2010 \ No newline at end of file +if impl(ghc < 8.10.0) + executable eventlog-to-opentelemetry + import: options + main-is: Main.hs + hs-source-dirs: exe/eventlog-to-opentelemetry + + build-depends: + base, + bytestring, + microlens, + opentelemetry-proto, + proto-lens, + default-language: Haskell2010 \ No newline at end of file diff --git a/stack-8.10.1.yaml b/stack-8.10.1.yaml index 8c4bc56..b03fe0f 100644 --- a/stack-8.10.1.yaml +++ b/stack-8.10.1.yaml @@ -5,7 +5,6 @@ packages: - opentelemetry - opentelemetry-extra - opentelemetry-lightstep -- opentelemetry-proto - opentelemetry-wai allow-newer: true From 20f525067462db16a2c7667e117feecaeddd1824 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Sun, 31 May 2020 10:09:09 -0700 Subject: [PATCH 08/22] eventlog-to-ot try buildable --- opentelemetry-extra/opentelemetry-extra.cabal | 28 ++++++++++--------- opentelemetry-proto/opentelemetry-proto.cabal | 6 ++++ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/opentelemetry-extra/opentelemetry-extra.cabal b/opentelemetry-extra/opentelemetry-extra.cabal index 913e6ba..13222ea 100644 --- a/opentelemetry-extra/opentelemetry-extra.cabal +++ b/opentelemetry-extra/opentelemetry-extra.cabal @@ -160,16 +160,18 @@ executable eventlog-to-tracy base, process, -if impl(ghc < 8.10.0) - executable eventlog-to-opentelemetry - import: options - main-is: Main.hs - hs-source-dirs: exe/eventlog-to-opentelemetry - - build-depends: - base, - bytestring, - microlens, - opentelemetry-proto, - proto-lens, - default-language: Haskell2010 \ No newline at end of file +executable eventlog-to-opentelemetry + import: options + main-is: Main.hs + hs-source-dirs: exe/eventlog-to-opentelemetry + if impl(ghc < 8.10.0) + buildable: True + else + buildable: False + build-depends: + base, + bytestring, + microlens, + opentelemetry-proto, + proto-lens, + default-language: Haskell2010 diff --git a/opentelemetry-proto/opentelemetry-proto.cabal b/opentelemetry-proto/opentelemetry-proto.cabal index 5f3c76a..2bf8f55 100644 --- a/opentelemetry-proto/opentelemetry-proto.cabal +++ b/opentelemetry-proto/opentelemetry-proto.cabal @@ -31,6 +31,7 @@ common options -freverse-errors + custom-setup setup-depends: Cabal @@ -40,6 +41,11 @@ custom-setup library import: options + if impl(ghc < 8.10.0) + buildable: True + else + buildable: False + build-depends: base >= 4.12 && < 5, proto-lens-runtime From 7f5b5aaac7d60d3d7c99b9b2bbe682c3e2d76cd9 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Sun, 31 May 2020 10:18:43 -0700 Subject: [PATCH 09/22] eventlog-to-ot enumerate cabal projects --- cabal.project | 10 +++++++++- opentelemetry-proto/opentelemetry-proto.cabal | 5 ----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/cabal.project b/cabal.project index f44a24c..2016cf5 100644 --- a/cabal.project +++ b/cabal.project @@ -1 +1,9 @@ -packages: */*.cabal +if impl(ghc < 8.10.0) + packages: */*.cabal +else + packages: opentelemetry/opentelemetry.cabal + megaexample/megaexample.cabal + opentelemetry-extra/opentelemetry-extra.cabal + opentelemetry-lightstep/opentelemetry-lightstep.cabal + -- opentelemetry-proto/opentelemetry-proto.cabal + opentelemetry-wai/opentelemetry-wai.cabal diff --git a/opentelemetry-proto/opentelemetry-proto.cabal b/opentelemetry-proto/opentelemetry-proto.cabal index 2bf8f55..776ec7e 100644 --- a/opentelemetry-proto/opentelemetry-proto.cabal +++ b/opentelemetry-proto/opentelemetry-proto.cabal @@ -41,11 +41,6 @@ custom-setup library import: options - if impl(ghc < 8.10.0) - buildable: True - else - buildable: False - build-depends: base >= 4.12 && < 5, proto-lens-runtime From 7e5a99567ce49f46d426380b2893764d11e4b78e Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Mon, 1 Jun 2020 18:47:47 -0700 Subject: [PATCH 10/22] eventlog-to-ot revert cabal.project --- cabal.project | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/cabal.project b/cabal.project index 2016cf5..f44a24c 100644 --- a/cabal.project +++ b/cabal.project @@ -1,9 +1 @@ -if impl(ghc < 8.10.0) - packages: */*.cabal -else - packages: opentelemetry/opentelemetry.cabal - megaexample/megaexample.cabal - opentelemetry-extra/opentelemetry-extra.cabal - opentelemetry-lightstep/opentelemetry-lightstep.cabal - -- opentelemetry-proto/opentelemetry-proto.cabal - opentelemetry-wai/opentelemetry-wai.cabal +packages: */*.cabal From 38c78eacb8e817d1e4ccdcd9b1043a6a1970dbe9 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Mon, 1 Jun 2020 18:49:05 -0700 Subject: [PATCH 11/22] eventlog-to-ot revert opentelemetry-extra.cabal --- opentelemetry-extra/opentelemetry-extra.cabal | 4 ---- 1 file changed, 4 deletions(-) diff --git a/opentelemetry-extra/opentelemetry-extra.cabal b/opentelemetry-extra/opentelemetry-extra.cabal index 13222ea..57060cd 100644 --- a/opentelemetry-extra/opentelemetry-extra.cabal +++ b/opentelemetry-extra/opentelemetry-extra.cabal @@ -164,10 +164,6 @@ executable eventlog-to-opentelemetry import: options main-is: Main.hs hs-source-dirs: exe/eventlog-to-opentelemetry - if impl(ghc < 8.10.0) - buildable: True - else - buildable: False build-depends: base, bytestring, From db3904cae61becddbce33498bef9a355ebae7ab3 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Tue, 2 Jun 2020 11:01:09 -0700 Subject: [PATCH 12/22] eventlog-to-ot console params --- .../exe/eventlog-to-opentelemetry/Main.hs | 60 +++++++++++++++++-- opentelemetry-extra/opentelemetry-extra.cabal | 5 ++ 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs index d344c59..8bf3e9b 100644 --- a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs @@ -1,4 +1,7 @@ -{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE TemplateHaskell #-} module Main where @@ -6,9 +9,13 @@ import Data.ProtoLens (defMessage, showMessage) import Data.ProtoLens.Encoding (encodeMessage, decodeMessageOrDie) import Data.ByteString as BS - +import Data.Maybe import Lens.Micro +import Lens.Micro.TH +import OpenTelemetry.EventlogStreaming_Internal +import OpenTelemetry.Exporter +import Options.Applicative as OA import Proto.Opentelemetry.Proto.Common.V1.Common as C import Proto.Opentelemetry.Proto.Common.V1.Common_Fields as C import Proto.Opentelemetry.Proto.Resource.V1.Resource as R @@ -16,6 +23,22 @@ import Proto.Opentelemetry.Proto.Resource.V1.Resource_Fields as R import Proto.Opentelemetry.Proto.Trace.V1.Trace as T import Proto.Opentelemetry.Proto.Trace.V1.Trace_Fields as T +import System.FilePath.Posix + + +data Command = TraceCommand + { _trCmdSrc :: FilePath + , _trCmdDst :: Maybe FilePath + } deriving (Show) + +makeLenses ''Command + +data ConsoleOptions = ConsoleOptions + { _coCmd :: Command + } deriving (Show) + + +makeLenses ''ConsoleOptions resource1 :: C.AttributeKeyValue resource1 = @@ -26,6 +49,33 @@ resource1 = main :: IO () main = do - let msg :: C.AttributeKeyValue = decodeMessageOrDie . encodeMessage $ resource1 - BS.writeFile "person.bin" . encodeMessage $ resource1 - Prelude.putStrLn . showMessage $ msg & (C.stringValue .~ "99") + cmd <- parseConsoleOptions + case cmd^.coCmd of + TraceCommand {..} -> do + let defaultDst = (-<.> "ot") . takeFileName $ cmd^.coCmd.trCmdSrc + let dstPath = fromMaybe defaultDst (cmd^.coCmd.trCmdDst) + let msg :: C.AttributeKeyValue = decodeMessageOrDie . encodeMessage $ resource1 + BS.writeFile dstPath . encodeMessage $ resource1 + Prelude.putStrLn . showMessage $ msg & (C.stringValue .~ "99") + + +extractTraceFromEventlogFileCmd :: Parser Command +extractTraceFromEventlogFileCmd + = TraceCommand <$> argument str (metavar "SRCFILE") + <*> option auto + ( long "out" + <> help ( "Path to out OpenTelemetry trace file." + ++ "By default current directory and extension .ot" ) + <> OA.value Nothing) + +consoleOptionParser :: Parser ConsoleOptions +consoleOptionParser + = ConsoleOptions + <$> hsubparser + (command "trace" + (info extractTraceFromEventlogFileCmd + (progDesc "converts Eventlog tracing into OpenTelemtry one"))) + +parseConsoleOptions :: IO ConsoleOptions +parseConsoleOptions + = execParser $ info (consoleOptionParser <**> helper) fullDesc diff --git a/opentelemetry-extra/opentelemetry-extra.cabal b/opentelemetry-extra/opentelemetry-extra.cabal index 57060cd..6b35972 100644 --- a/opentelemetry-extra/opentelemetry-extra.cabal +++ b/opentelemetry-extra/opentelemetry-extra.cabal @@ -168,6 +168,11 @@ executable eventlog-to-opentelemetry base, bytestring, microlens, + microlens-th, + opentelemetry >= 0.4.0, + opentelemetry-extra, opentelemetry-proto, + optparse-applicative, + filepath, proto-lens, default-language: Haskell2010 From 4ddec0ba0edc7915a63b2ff931c403617e2b044c Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Tue, 2 Jun 2020 12:00:29 -0700 Subject: [PATCH 13/22] eventlog-to-ot header --- .../exe/eventlog-to-opentelemetry/Main.hs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs index 8bf3e9b..9689104 100644 --- a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs @@ -40,6 +40,19 @@ data ConsoleOptions = ConsoleOptions makeLenses ''ConsoleOptions +headerAttr :: C.AttributeKeyValue +headerAttr = defMessage + & C.key .~ "Origin Logger" + & C.type' .~ C.AttributeKeyValue'STRING + & C.stringValue .~ "GHC Eventlog / opentelemetry-haskell" + +headerResource :: R.Resource +headerResource = + defMessage + & R.attributes .~ [headerAttr] + & C.type' .~ C.AttributeKeyValue'STRING + & C.stringValue .~ "World" + resource1 :: C.AttributeKeyValue resource1 = defMessage From fcf88f8153857ce4300ba02d6d88e39da8b70d57 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Wed, 3 Jun 2020 15:55:45 -0700 Subject: [PATCH 14/22] eventlog-to-ot generate OT required/some optional resoure attributes --- .../exe/eventlog-to-opentelemetry/Console.hs | 56 ++++++++++ .../exe/eventlog-to-opentelemetry/Json.hs | 12 +++ .../exe/eventlog-to-opentelemetry/Main.hs | 74 +++---------- .../exe/eventlog-to-opentelemetry/Resource.hs | 101 ++++++++++++++++++ opentelemetry-extra/opentelemetry-extra.cabal | 5 +- ot-header.json | 9 ++ 6 files changed, 194 insertions(+), 63 deletions(-) create mode 100644 opentelemetry-extra/exe/eventlog-to-opentelemetry/Console.hs create mode 100644 opentelemetry-extra/exe/eventlog-to-opentelemetry/Json.hs create mode 100644 opentelemetry-extra/exe/eventlog-to-opentelemetry/Resource.hs create mode 100644 ot-header.json diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Console.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Console.hs new file mode 100644 index 0000000..2b84896 --- /dev/null +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Console.hs @@ -0,0 +1,56 @@ +{-# LANGUAGE TemplateHaskell #-} + +module Console + ( parseConsoleOptions + , Command (..) + , ConsoleOptions (..) + , trCmdDst + , trCmdSrc + , coCmd + , trJsonHeader + ) where + + +import Lens.Micro.TH + +import Options.Applicative as OA + +data Command = TraceCommand + { _trCmdSrc :: FilePath + , _trCmdDst :: Maybe FilePath + , _trJsonHeader :: FilePath + } deriving (Show) + +makeLenses ''Command + +data ConsoleOptions = ConsoleOptions + { _coCmd :: Command + } deriving (Show) + +makeLenses ''ConsoleOptions + +extractTraceFromEventlogFileCmd :: Parser Command +extractTraceFromEventlogFileCmd + = TraceCommand <$> argument str (metavar "SRCFILE") + <*> optional (strOption + ( long "out" + <> help ( "Path to out OpenTelemetry trace file." + ++ " By default current directory and extension .ot" ) + )) + <*> option auto + ( long "header" + <> help "Path to json file with OpenTelemetry header info." + <> showDefault + <> OA.value "ot-header.json") + +consoleOptionParser :: Parser ConsoleOptions +consoleOptionParser + = ConsoleOptions + <$> hsubparser + (command "trace" + (info extractTraceFromEventlogFileCmd + (progDesc "converts Eventlog tracing into OpenTelemtry one"))) + +parseConsoleOptions :: IO ConsoleOptions +parseConsoleOptions + = execParser $ info (consoleOptionParser <**> helper) fullDesc diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Json.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Json.hs new file mode 100644 index 0000000..d12f7d6 --- /dev/null +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Json.hs @@ -0,0 +1,12 @@ +module Json (jsonOpts) where + +import Data.Aeson +import Data.Char + +-- extra file due TH constraint +jsonOpts :: Int -> Options +jsonOpts toDrop = defaultOptions + { fieldLabelModifier = drop toDrop + , omitNothingFields = True + , constructorTagModifier = map toLower + } diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs index 9689104..2b5639b 100644 --- a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs @@ -5,61 +5,28 @@ module Main where +import Console +import Data.Aeson as A import Data.ProtoLens (defMessage, showMessage) import Data.ProtoLens.Encoding (encodeMessage, decodeMessageOrDie) import Data.ByteString as BS +import Data.ByteString.Lazy as LBS import Data.Maybe import Lens.Micro import Lens.Micro.TH import OpenTelemetry.EventlogStreaming_Internal import OpenTelemetry.Exporter -import Options.Applicative as OA import Proto.Opentelemetry.Proto.Common.V1.Common as C import Proto.Opentelemetry.Proto.Common.V1.Common_Fields as C import Proto.Opentelemetry.Proto.Resource.V1.Resource as R -import Proto.Opentelemetry.Proto.Resource.V1.Resource_Fields as R import Proto.Opentelemetry.Proto.Trace.V1.Trace as T import Proto.Opentelemetry.Proto.Trace.V1.Trace_Fields as T - +import Resource import System.FilePath.Posix -data Command = TraceCommand - { _trCmdSrc :: FilePath - , _trCmdDst :: Maybe FilePath - } deriving (Show) - -makeLenses ''Command - -data ConsoleOptions = ConsoleOptions - { _coCmd :: Command - } deriving (Show) - - -makeLenses ''ConsoleOptions - -headerAttr :: C.AttributeKeyValue -headerAttr = defMessage - & C.key .~ "Origin Logger" - & C.type' .~ C.AttributeKeyValue'STRING - & C.stringValue .~ "GHC Eventlog / opentelemetry-haskell" - -headerResource :: R.Resource -headerResource = - defMessage - & R.attributes .~ [headerAttr] - & C.type' .~ C.AttributeKeyValue'STRING - & C.stringValue .~ "World" - -resource1 :: C.AttributeKeyValue -resource1 = - defMessage - & C.key .~ "Hello" - & C.type' .~ C.AttributeKeyValue'STRING - & C.stringValue .~ "World" - main :: IO () main = do cmd <- parseConsoleOptions @@ -67,28 +34,11 @@ main = do TraceCommand {..} -> do let defaultDst = (-<.> "ot") . takeFileName $ cmd^.coCmd.trCmdSrc let dstPath = fromMaybe defaultDst (cmd^.coCmd.trCmdDst) - let msg :: C.AttributeKeyValue = decodeMessageOrDie . encodeMessage $ resource1 - BS.writeFile dstPath . encodeMessage $ resource1 - Prelude.putStrLn . showMessage $ msg & (C.stringValue .~ "99") - - -extractTraceFromEventlogFileCmd :: Parser Command -extractTraceFromEventlogFileCmd - = TraceCommand <$> argument str (metavar "SRCFILE") - <*> option auto - ( long "out" - <> help ( "Path to out OpenTelemetry trace file." - ++ "By default current directory and extension .ot" ) - <> OA.value Nothing) - -consoleOptionParser :: Parser ConsoleOptions -consoleOptionParser - = ConsoleOptions - <$> hsubparser - (command "trace" - (info extractTraceFromEventlogFileCmd - (progDesc "converts Eventlog tracing into OpenTelemtry one"))) - -parseConsoleOptions :: IO ConsoleOptions -parseConsoleOptions - = execParser $ info (consoleOptionParser <**> helper) fullDesc + let emptyHeaderErr = error $ "empty json header file: " + ++ cmd^.coCmd.trJsonHeader + header :: ResourceHeader <- (fromMaybe emptyHeaderErr . A.decode) + <$> LBS.readFile (cmd^.coCmd.trJsonHeader) + let encodedHeader = encodeMessage . (\x -> (convertTo x) :: R.Resource) $ header + BS.writeFile dstPath encodedHeader + let msg :: R.Resource = decodeMessageOrDie encodedHeader + Prelude.putStrLn . showMessage $ msg diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Resource.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Resource.hs new file mode 100644 index 0000000..e295561 --- /dev/null +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Resource.hs @@ -0,0 +1,101 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE FlexibleContexts #-} + +module Resource where + +import Data.Aeson.TH +import Data.List as L +import Data.Maybe +import Data.ProtoLens (defMessage) +import Data.Text + +import Json + +import Lens.Micro + +import Proto.Opentelemetry.Proto.Common.V1.Common as C +import Proto.Opentelemetry.Proto.Common.V1.Common_Fields as C +import Proto.Opentelemetry.Proto.Resource.V1.Resource as R +import Proto.Opentelemetry.Proto.Resource.V1.Resource_Fields as R + +-- header structures to list of KeyValueAttribute +class ConversionTo src dst where + convertTo :: src -> dst + +strAttr :: Text -> Text -> C.AttributeKeyValue +strAttr attrName attrVal = defMessage + & C.key .~ attrName + & C.type' .~ C.AttributeKeyValue'STRING + & C.stringValue .~ attrVal + +data ServiceHeader = ServiceHeader + { _sName :: Text + , _sNameSpace :: Maybe Text + , _sInstanceId :: Text + , _sVersion :: Maybe Text + } deriving (Eq, Show) + +$(deriveJSON (jsonOpts 2) ''ServiceHeader) + +instance ConversionTo ServiceHeader [C.AttributeKeyValue] where + convertTo ServiceHeader{..} = mandatory ++ extras + where + sa k = strAttr (("service."::Text) <> k) + mandatory = [ sa "name" _sName, sa "instance.id" _sInstanceId ] + extras = catMaybes [ + fmap (sa "namespace") _sNameSpace, + fmap (sa "version") _sVersion + ] + +data ExtraResourceHeader + = TelemetrySdk + { _tlsSdkName :: Text + , _tlsSdkLanguage :: Text + } + | ComputeUnitContainer + { _cucName :: Text + , _cucImageName :: Text + } + | ComputeInstanceHost + { _cihHost :: Text + , _cihId :: Text + } + deriving (Eq, Show) + +$(deriveJSON (jsonOpts 4) ''ExtraResourceHeader) + +instance ConversionTo ExtraResourceHeader [C.AttributeKeyValue] where + convertTo TelemetrySdk{..} = + [ strAttr "telemetry.sdk.name" _tlsSdkName + , strAttr "telemetry.sdk.language" "haskell" + ] + convertTo ComputeUnitContainer{..} = + [ strAttr "container.name" _cucName + , strAttr "container.image.name" _cucImageName + ] + convertTo ComputeInstanceHost{..} = + [ strAttr "host.name" _cihHost + , strAttr "host.hostname" _cihHost + , strAttr "host.id" _cihId + ] + + +data ResourceHeader = ResourceHeader + { _rServiceHeader :: ServiceHeader + , _rExtraHeaders :: [ ExtraResourceHeader ] + } deriving (Eq, Show) + +$(deriveJSON (jsonOpts 2) ''ResourceHeader) + +instance ConversionTo ResourceHeader R.Resource where + convertTo ResourceHeader{..} = + defMessage + & R.attributes .~ attrs + & R.droppedAttributesCount .~ 0 + where + c a = (convertTo a) :: [C.AttributeKeyValue] + attrs = c _rServiceHeader ++ (L.concat $ fmap c _rExtraHeaders) diff --git a/opentelemetry-extra/opentelemetry-extra.cabal b/opentelemetry-extra/opentelemetry-extra.cabal index 6b35972..ea05858 100644 --- a/opentelemetry-extra/opentelemetry-extra.cabal +++ b/opentelemetry-extra/opentelemetry-extra.cabal @@ -164,15 +164,18 @@ executable eventlog-to-opentelemetry import: options main-is: Main.hs hs-source-dirs: exe/eventlog-to-opentelemetry + other-modules: Console, Json, Resource build-depends: + aeson, base, bytestring, + filepath, microlens, microlens-th, opentelemetry >= 0.4.0, opentelemetry-extra, opentelemetry-proto, optparse-applicative, - filepath, proto-lens, + text, default-language: Haskell2010 diff --git a/ot-header.json b/ot-header.json new file mode 100644 index 0000000..5b4e8d7 --- /dev/null +++ b/ot-header.json @@ -0,0 +1,9 @@ +{ + "ServiceHeader": { + "Name": "service1", + "NameSpace": "*", + "InstanceId": "74036208-6af7-4f12-b260-23bb2f1334d3", + "Version": "version:0.0.1" + }, + "ExtraHeaders": [] +} From 753037dfb7bc75100d445a7a11f286ccaac90504 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Wed, 3 Jun 2020 16:02:17 -0700 Subject: [PATCH 15/22] eventlog-to-ot add proto for 8.10 --- stack-8.10.1.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/stack-8.10.1.yaml b/stack-8.10.1.yaml index b03fe0f..8c4bc56 100644 --- a/stack-8.10.1.yaml +++ b/stack-8.10.1.yaml @@ -5,6 +5,7 @@ packages: - opentelemetry - opentelemetry-extra - opentelemetry-lightstep +- opentelemetry-proto - opentelemetry-wai allow-newer: true From 722a71526201506a143bd5baeb0833f592bf7d33 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Wed, 3 Jun 2020 16:09:17 -0700 Subject: [PATCH 16/22] eventlog-to-ot ghc-source-gen-0.4.0.0 --- stack-8.10.1.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/stack-8.10.1.yaml b/stack-8.10.1.yaml index 8c4bc56..68c2328 100644 --- a/stack-8.10.1.yaml +++ b/stack-8.10.1.yaml @@ -13,3 +13,4 @@ allow-newer: true extra-deps: - ghc-events-0.13.0 - ghc-trace-events-0.1.0.1 +- ghc-source-gen-0.4.0.0 From 24d718f40adc1f1f05c24fc9c950e97a08eede76 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Wed, 3 Jun 2020 16:19:12 -0700 Subject: [PATCH 17/22] eventlog-to-ot upgrade resolver 8.10 to 15.15 --- stack-8.10.1.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stack-8.10.1.yaml b/stack-8.10.1.yaml index 68c2328..2809ef8 100644 --- a/stack-8.10.1.yaml +++ b/stack-8.10.1.yaml @@ -1,4 +1,4 @@ -resolver: lts-15.13 +resolver: lts-15.15 compiler: ghc-8.10.1 packages: - megaexample From b712d79c08205a9a49427d3259d8f4751655bc4f Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Wed, 3 Jun 2020 16:54:04 -0700 Subject: [PATCH 18/22] eventlog-to-ot proto-lens from source for 8.10 --- stack-8.10.1.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/stack-8.10.1.yaml b/stack-8.10.1.yaml index 2809ef8..44d5668 100644 --- a/stack-8.10.1.yaml +++ b/stack-8.10.1.yaml @@ -14,3 +14,5 @@ extra-deps: - ghc-events-0.13.0 - ghc-trace-events-0.1.0.1 - ghc-source-gen-0.4.0.0 +- git: https://github.com/google/proto-lens.git + commit: 0bef8c2f3da645f068b8a26ac168c1da41608182 From b4223b0c29eb05a062179070b3c418a83ad86434 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Wed, 3 Jun 2020 17:12:06 -0700 Subject: [PATCH 19/22] eventlog-to-ot fix subdirs proto-lens --- stack-8.10.1.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stack-8.10.1.yaml b/stack-8.10.1.yaml index 44d5668..5f46f85 100644 --- a/stack-8.10.1.yaml +++ b/stack-8.10.1.yaml @@ -14,5 +14,6 @@ extra-deps: - ghc-events-0.13.0 - ghc-trace-events-0.1.0.1 - ghc-source-gen-0.4.0.0 -- git: https://github.com/google/proto-lens.git +- github: google/proto-lens commit: 0bef8c2f3da645f068b8a26ac168c1da41608182 + subdirs: proto-lens From a6430153ff6ab76ae33659df7ce150e11b328d18 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Wed, 3 Jun 2020 22:21:38 -0700 Subject: [PATCH 20/22] eventlog-to-ot first eventlog to OpenTelemetry converter --- .../eventlog-to-opentelemetry/Attribute.hs | 28 ++++++ .../exe/eventlog-to-opentelemetry/Main.hs | 40 ++++++--- .../exe/eventlog-to-opentelemetry/Resource.hs | 8 +- .../exe/eventlog-to-opentelemetry/Spans.hs | 86 +++++++++++++++++++ opentelemetry-extra/opentelemetry-extra.cabal | 4 +- 5 files changed, 146 insertions(+), 20 deletions(-) create mode 100644 opentelemetry-extra/exe/eventlog-to-opentelemetry/Attribute.hs create mode 100644 opentelemetry-extra/exe/eventlog-to-opentelemetry/Spans.hs diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Attribute.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Attribute.hs new file mode 100644 index 0000000..ffb7dc7 --- /dev/null +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Attribute.hs @@ -0,0 +1,28 @@ +{-# LANGUAGE FlexibleContexts #-} +module Attribute where + +import Data.ProtoLens (defMessage) +import Data.Text +import Lens.Micro +import OpenTelemetry.Common +import qualified Proto.Opentelemetry.Proto.Common.V1.Common as C +import qualified Proto.Opentelemetry.Proto.Common.V1.Common_Fields as C + + +strAttr :: Text -> Text -> C.AttributeKeyValue +strAttr attrName attrVal = defMessage + & C.key .~ attrName + & C.type' .~ C.AttributeKeyValue'STRING + & C.stringValue .~ attrVal + +tagToAttribute :: Text -> TagValue -> C.AttributeKeyValue +tagToAttribute name val = defMessage & C.key .~ name & (setVal val) + where + setVal (StringTagValue (TagVal v)) = + (C.type' .~ C.AttributeKeyValue'STRING) . (C.stringValue .~ v) + setVal (BoolTagValue v) = + (C.type' .~ C.AttributeKeyValue'BOOL) . (C.boolValue .~ v) + setVal (IntTagValue v) = + (C.type' .~ C.AttributeKeyValue'INT) . (C.intValue .~ fromIntegral v) + setVal (DoubleTagValue v) = + (C.type' .~ C.AttributeKeyValue'DOUBLE) . (C.doubleValue .~ v) diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs index 2b5639b..813db69 100644 --- a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs @@ -7,25 +7,41 @@ module Main where import Console import Data.Aeson as A -import Data.ProtoLens (defMessage, showMessage) -import Data.ProtoLens.Encoding (encodeMessage, decodeMessageOrDie) +import Data.ProtoLens (defMessage) +import Data.ProtoLens.Encoding (encodeMessage) import Data.ByteString as BS import Data.ByteString.Lazy as LBS import Data.Maybe import Lens.Micro -import Lens.Micro.TH + +import OpenTelemetry.Common as OC import OpenTelemetry.EventlogStreaming_Internal import OpenTelemetry.Exporter -import Proto.Opentelemetry.Proto.Common.V1.Common as C -import Proto.Opentelemetry.Proto.Common.V1.Common_Fields as C -import Proto.Opentelemetry.Proto.Resource.V1.Resource as R -import Proto.Opentelemetry.Proto.Trace.V1.Trace as T -import Proto.Opentelemetry.Proto.Trace.V1.Trace_Fields as T + +import qualified Proto.Opentelemetry.Proto.Resource.V1.Resource as R +import qualified Proto.Opentelemetry.Proto.Trace.V1.Trace as T +import qualified Proto.Opentelemetry.Proto.Trace.V1.Trace_Fields as T import Resource +import Spans +import System.Clock import System.FilePath.Posix +import System.IO +createExporter :: R.Resource -> FilePath -> IO (Exporter OC.Span) +createExporter resource path = do + f <- openFile path WriteMode + pure + $! Exporter + ( \sps -> do + let msg :: T.ResourceSpans = defMessage + & T.resource .~ resource + & T.instrumentationLibrarySpans .~ [spansToLibSpans sps] + BS.hPut f (encodeMessage msg) + pure ExportSuccess + ) + (hClose f) main :: IO () main = do @@ -38,7 +54,7 @@ main = do ++ cmd^.coCmd.trJsonHeader header :: ResourceHeader <- (fromMaybe emptyHeaderErr . A.decode) <$> LBS.readFile (cmd^.coCmd.trJsonHeader) - let encodedHeader = encodeMessage . (\x -> (convertTo x) :: R.Resource) $ header - BS.writeFile dstPath encodedHeader - let msg :: R.Resource = decodeMessageOrDie encodedHeader - Prelude.putStrLn . showMessage $ msg + exporter <- createExporter (convertTo header) dstPath + origin_timestamp <- fromIntegral . toNanoSecs <$> getTime Realtime + work origin_timestamp exporter $ EventLogFilename dstPath + shutdown exporter diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Resource.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Resource.hs index e295561..2a99c64 100644 --- a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Resource.hs +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Resource.hs @@ -7,6 +7,7 @@ module Resource where +import Attribute import Data.Aeson.TH import Data.List as L import Data.Maybe @@ -18,7 +19,6 @@ import Json import Lens.Micro import Proto.Opentelemetry.Proto.Common.V1.Common as C -import Proto.Opentelemetry.Proto.Common.V1.Common_Fields as C import Proto.Opentelemetry.Proto.Resource.V1.Resource as R import Proto.Opentelemetry.Proto.Resource.V1.Resource_Fields as R @@ -26,12 +26,6 @@ import Proto.Opentelemetry.Proto.Resource.V1.Resource_Fields as R class ConversionTo src dst where convertTo :: src -> dst -strAttr :: Text -> Text -> C.AttributeKeyValue -strAttr attrName attrVal = defMessage - & C.key .~ attrName - & C.type' .~ C.AttributeKeyValue'STRING - & C.stringValue .~ attrVal - data ServiceHeader = ServiceHeader { _sName :: Text , _sNameSpace :: Maybe Text diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Spans.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Spans.hs new file mode 100644 index 0000000..aa8dc39 --- /dev/null +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Spans.hs @@ -0,0 +1,86 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE FlexibleContexts #-} + +module Spans where + +import Attribute +import Data.ByteString as BS +import Data.ByteString.Builder as BSB +import Data.ByteString.Lazy as LBS +import Data.Coerce +import qualified Data.HashMap.Strict as HM + +import Data.ProtoLens (defMessage) +import Data.Word +import Lens.Micro + +import OpenTelemetry.Common as OTC +import OpenTelemetry.SpanContext + +import Proto.Opentelemetry.Proto.Common.V1.Common as C +import Proto.Opentelemetry.Proto.Common.V1.Common_Fields as C +import Proto.Opentelemetry.Proto.Trace.V1.Trace as T +import Proto.Opentelemetry.Proto.Trace.V1.Trace_Fields as T + +import Resource + +instrLib :: C.InstrumentationLibrary +instrLib = defMessage + & C.name .~ "OpenTelemetry-haskell" + & C.version .~ "0.4.0" + + +spansToLibSpans :: [OTC.Span] -> T.InstrumentationLibrarySpans +spansToLibSpans sps = + defMessage + & T.instrumentationLibrary .~ instrLib + & T.spans .~ (fmap span2Span sps) + + +w8 :: Word64 -> BSB.Builder +w8 = word64LE + +sbs :: BSB.Builder -> BS.ByteString +sbs = toStrict . toLazyByteString + +maybeSpanToBytes :: Maybe SpanId -> BS.ByteString +maybeSpanToBytes Nothing = mempty +maybeSpanToBytes (Just (SId parentSid)) = sbs $ w8 parentSid + +newtype AttributeTags = AttributeTags (HM.HashMap TagName TagValue) + +instance ConversionTo AttributeTags [C.AttributeKeyValue] where + convertTo (AttributeTags m) = fmap tuple2Attr $ HM.toList m + where tuple2Attr (TagName k, v) = tagToAttribute k v +newtype AttributeSpanEvent = AttributeSpanEvent SpanEvent + +instance ConversionTo AttributeSpanEvent T.Span'Event where + convertTo (AttributeSpanEvent SpanEvent{..}) = + defMessage + & T.name .~ (coerce spanEventKey) + & T.droppedAttributesCount .~ 0 + & T.timeUnixNano .~ spanEventTimestamp + & T.attributes .~ [strAttr "text" $ coerce spanEventValue] + +span2Span :: OTC.Span -> T.Span +span2Span Span{..} = + case spanContext of + SpanContext (SId sid) (TId tid) -> + defMessage + & T.traceId .~ (sbs $ w8 sid <> w8 sid) + & T.spanId .~ (sbs $ w8 tid) + -- & T.traceState .~ + & T.parentSpanId .~ (maybeSpanToBytes spanParentId) + & T.name .~ spanOperation + -- & T.kind .~ not enough info + & T.startTimeUnixNano .~ spanStartedAt + & T.endTimeUnixNano .~ spanFinishedAt + & T.attributes .~ (convertTo $ AttributeTags spanTags) + & T.events .~ (fmap (convertTo . AttributeSpanEvent) spanEvents) + & T.droppedAttributesCount .~ 0 + & T.links .~ [] + & T.droppedLinksCount .~ 0 + & T.status .~ (defMessage & T.code .~ T.Status'Ok) diff --git a/opentelemetry-extra/opentelemetry-extra.cabal b/opentelemetry-extra/opentelemetry-extra.cabal index ea05858..5c71132 100644 --- a/opentelemetry-extra/opentelemetry-extra.cabal +++ b/opentelemetry-extra/opentelemetry-extra.cabal @@ -164,11 +164,12 @@ executable eventlog-to-opentelemetry import: options main-is: Main.hs hs-source-dirs: exe/eventlog-to-opentelemetry - other-modules: Console, Json, Resource + other-modules: Console, Json, Resource, Attribute, Spans build-depends: aeson, base, bytestring, + clock, filepath, microlens, microlens-th, @@ -178,4 +179,5 @@ executable eventlog-to-opentelemetry optparse-applicative, proto-lens, text, + unordered-containers, default-language: Haskell2010 From 4001ed583e41239969627d25103dcd6389301466 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Fri, 5 Jun 2020 09:53:40 -0700 Subject: [PATCH 21/22] eventlog-to-ot use proto-lens 7 --- stack-8.10.1.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/stack-8.10.1.yaml b/stack-8.10.1.yaml index 5f46f85..6ed3fa2 100644 --- a/stack-8.10.1.yaml +++ b/stack-8.10.1.yaml @@ -14,6 +14,4 @@ extra-deps: - ghc-events-0.13.0 - ghc-trace-events-0.1.0.1 - ghc-source-gen-0.4.0.0 -- github: google/proto-lens - commit: 0bef8c2f3da645f068b8a26ac168c1da41608182 - subdirs: proto-lens +- proto-lens-0.7.0.0 From e4af881860082b903bc010ebcfebff572280d858 Mon Sep 17 00:00:00 2001 From: Daneel Yaitskov Date: Mon, 8 Jun 2020 21:28:22 -0700 Subject: [PATCH 22/22] eventlog-to-ot move eventlog-to-opentelemetry modules to OpenTelemetry submodule --- .../exe/eventlog-to-opentelemetry/Main.hs | 7 +++---- .../{ => OpenTelemetry}/Attribute.hs | 2 +- .../{ => OpenTelemetry}/Console.hs | 2 +- .../{ => OpenTelemetry}/Json.hs | 2 +- .../{ => OpenTelemetry}/Resource.hs | 9 +++------ .../{ => OpenTelemetry}/Spans.hs | 8 +++----- opentelemetry-extra/opentelemetry-extra.cabal | 7 ++++++- 7 files changed, 18 insertions(+), 19 deletions(-) rename opentelemetry-extra/exe/eventlog-to-opentelemetry/{ => OpenTelemetry}/Attribute.hs (96%) rename opentelemetry-extra/exe/eventlog-to-opentelemetry/{ => OpenTelemetry}/Console.hs (98%) rename opentelemetry-extra/exe/eventlog-to-opentelemetry/{ => OpenTelemetry}/Json.hs (87%) rename opentelemetry-extra/exe/eventlog-to-opentelemetry/{ => OpenTelemetry}/Resource.hs (96%) rename opentelemetry-extra/exe/eventlog-to-opentelemetry/{ => OpenTelemetry}/Spans.hs (96%) diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs index 813db69..7844907 100644 --- a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/Main.hs @@ -5,7 +5,6 @@ module Main where -import Console import Data.Aeson as A import Data.ProtoLens (defMessage) import Data.ProtoLens.Encoding (encodeMessage) @@ -19,12 +18,12 @@ import OpenTelemetry.Common as OC import OpenTelemetry.EventlogStreaming_Internal import OpenTelemetry.Exporter - import qualified Proto.Opentelemetry.Proto.Resource.V1.Resource as R import qualified Proto.Opentelemetry.Proto.Trace.V1.Trace as T import qualified Proto.Opentelemetry.Proto.Trace.V1.Trace_Fields as T -import Resource -import Spans +import OpenTelemetry.Console +import OpenTelemetry.Resource +import OpenTelemetry.Spans import System.Clock import System.FilePath.Posix import System.IO diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Attribute.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Attribute.hs similarity index 96% rename from opentelemetry-extra/exe/eventlog-to-opentelemetry/Attribute.hs rename to opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Attribute.hs index ffb7dc7..eb1b8bf 100644 --- a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Attribute.hs +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Attribute.hs @@ -1,5 +1,5 @@ {-# LANGUAGE FlexibleContexts #-} -module Attribute where +module OpenTelemetry.Attribute where import Data.ProtoLens (defMessage) import Data.Text diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Console.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Console.hs similarity index 98% rename from opentelemetry-extra/exe/eventlog-to-opentelemetry/Console.hs rename to opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Console.hs index 2b84896..ce29502 100644 --- a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Console.hs +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Console.hs @@ -1,6 +1,6 @@ {-# LANGUAGE TemplateHaskell #-} -module Console +module OpenTelemetry.Console ( parseConsoleOptions , Command (..) , ConsoleOptions (..) diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Json.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Json.hs similarity index 87% rename from opentelemetry-extra/exe/eventlog-to-opentelemetry/Json.hs rename to opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Json.hs index d12f7d6..b6d6cee 100644 --- a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Json.hs +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Json.hs @@ -1,4 +1,4 @@ -module Json (jsonOpts) where +module OpenTelemetry.Json (jsonOpts) where import Data.Aeson import Data.Char diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Resource.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Resource.hs similarity index 96% rename from opentelemetry-extra/exe/eventlog-to-opentelemetry/Resource.hs rename to opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Resource.hs index 2a99c64..aff7640 100644 --- a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Resource.hs +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Resource.hs @@ -5,19 +5,16 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} -module Resource where +module OpenTelemetry.Resource where -import Attribute import Data.Aeson.TH import Data.List as L import Data.Maybe import Data.ProtoLens (defMessage) import Data.Text - -import Json - import Lens.Micro - +import OpenTelemetry.Attribute +import OpenTelemetry.Json import Proto.Opentelemetry.Proto.Common.V1.Common as C import Proto.Opentelemetry.Proto.Resource.V1.Resource as R import Proto.Opentelemetry.Proto.Resource.V1.Resource_Fields as R diff --git a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Spans.hs b/opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Spans.hs similarity index 96% rename from opentelemetry-extra/exe/eventlog-to-opentelemetry/Spans.hs rename to opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Spans.hs index aa8dc39..5019155 100644 --- a/opentelemetry-extra/exe/eventlog-to-opentelemetry/Spans.hs +++ b/opentelemetry-extra/exe/eventlog-to-opentelemetry/OpenTelemetry/Spans.hs @@ -4,9 +4,8 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} -module Spans where +module OpenTelemetry.Spans where -import Attribute import Data.ByteString as BS import Data.ByteString.Builder as BSB import Data.ByteString.Lazy as LBS @@ -16,16 +15,15 @@ import qualified Data.HashMap.Strict as HM import Data.ProtoLens (defMessage) import Data.Word import Lens.Micro - +import OpenTelemetry.Attribute import OpenTelemetry.Common as OTC import OpenTelemetry.SpanContext - +import OpenTelemetry.Resource import Proto.Opentelemetry.Proto.Common.V1.Common as C import Proto.Opentelemetry.Proto.Common.V1.Common_Fields as C import Proto.Opentelemetry.Proto.Trace.V1.Trace as T import Proto.Opentelemetry.Proto.Trace.V1.Trace_Fields as T -import Resource instrLib :: C.InstrumentationLibrary instrLib = defMessage diff --git a/opentelemetry-extra/opentelemetry-extra.cabal b/opentelemetry-extra/opentelemetry-extra.cabal index c3febcb..9336c37 100644 --- a/opentelemetry-extra/opentelemetry-extra.cabal +++ b/opentelemetry-extra/opentelemetry-extra.cabal @@ -169,7 +169,12 @@ executable eventlog-to-opentelemetry import: options main-is: Main.hs hs-source-dirs: exe/eventlog-to-opentelemetry - other-modules: Console, Json, Resource, Attribute, Spans + other-modules: + OpenTelemetry.Console, + OpenTelemetry.Json, + OpenTelemetry.Resource, + OpenTelemetry.Attribute, + OpenTelemetry.Spans build-depends: aeson, base,