diff --git a/.github/workflows/static_code_analysis.yml b/.github/workflows/static_code_analysis.yml index 27963aced..92bb6348b 100644 --- a/.github/workflows/static_code_analysis.yml +++ b/.github/workflows/static_code_analysis.yml @@ -10,7 +10,7 @@ permissions: contents: read jobs: - golangci: + go-lint: name: Go lint runs-on: ubuntu-latest steps: @@ -141,7 +141,26 @@ jobs: with: version: latest working-directory: tap/extensions/redis - + + - name: Check logger modified files + id: logger_modified_files + run: devops/check_modified_files.sh logger/ + + - name: Go lint - logger + uses: golangci/golangci-lint-action@v2 + if: steps.logger_modified_files.outputs.matched == 'true' + with: + version: latest + working-directory: logger + + es-lint: + name: ES lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 2 + - uses: actions/setup-node@v2 with: node-version: 16 diff --git a/Dockerfile b/Dockerfile index c734d16ec..62ba07c93 100644 --- a/Dockerfile +++ b/Dockerfile @@ -44,11 +44,18 @@ ENV CGO_ENABLED=1 GOOS=linux ENV GOARCH=arm64 CGO_CFLAGS="-I/work/libpcap" +### Builder image for AArch64 to x86-64 cross-compilation +FROM up9inc/linux-x86_64-musl-go-libpcap AS builder-from-arm64v8-to-amd64 +ENV CGO_ENABLED=1 GOOS=linux +ENV GOARCH=amd64 CGO_CFLAGS="-I/libpcap" + + ### Final builder image where the build happens # Possible build strategies: # BUILDARCH=amd64 TARGETARCH=amd64 # BUILDARCH=arm64v8 TARGETARCH=arm64v8 # BUILDARCH=amd64 TARGETARCH=arm64v8 +# BUILDARCH=arm64v8 TARGETARCH=amd64 ARG BUILDARCH=amd64 ARG TARGETARCH=amd64 FROM builder-from-${BUILDARCH}-to-${TARGETARCH} AS builder @@ -66,9 +73,6 @@ COPY tap/extensions/http/go.mod ../tap/extensions/http/ COPY tap/extensions/kafka/go.mod ../tap/extensions/kafka/ COPY tap/extensions/redis/go.mod ../tap/extensions/redis/ RUN go mod download -# cheap trick to make the build faster (as long as go.mod did not change) -RUN go get github.com/patrickmn/go-cache -RUN go list -f '{{.Path}}@{{.Version}}' -m all | sed 1d | grep -e 'go-cache' | xargs go get # Copy and build agent code COPY shared ../shared diff --git a/agent/go.mod b/agent/go.mod index 2f9350f4b..b1cd82e82 100644 --- a/agent/go.mod +++ b/agent/go.mod @@ -85,6 +85,7 @@ require ( github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mertyildiran/gqlparser/v2 v2.4.6 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/moby/spdystream v0.2.0 // indirect github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect @@ -110,7 +111,7 @@ require ( github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 // indirect github.com/xlab/treeprint v1.1.0 // indirect go.starlark.net v0.0.0-20220203230714-bb14e151c28f // indirect - golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab // indirect + golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b // indirect golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect golang.org/x/sys v0.0.0-20220207234003-57398862261d // indirect diff --git a/agent/go.sum b/agent/go.sum index 6b5bcb87b..499f9dd19 100644 --- a/agent/go.sum +++ b/agent/go.sum @@ -83,6 +83,7 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -493,6 +494,8 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mertyildiran/gqlparser/v2 v2.4.6 h1:enAq4F5PYgW/rYExPNzYt7IYrrZnzrfqdywMA1QdFtM= +github.com/mertyildiran/gqlparser/v2 v2.4.6/go.mod h1:XZId58F+XqRSmoLrdsOLgqA918oNvBzuOORruJWBjDo= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= @@ -751,8 +754,9 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab h1:lnZ4LoV0UMdibeCUfIB2a4uFwRu491WX/VB2reB8xNc= golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b h1:Qwe1rC8PSniVfAFPFJeyUkB+zcysC3RgJBAGk7eqBEU= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= diff --git a/agent/pkg/resolver/go.sum b/agent/pkg/resolver/go.sum index b60e6fec6..4fb6e9bb6 100644 --- a/agent/pkg/resolver/go.sum +++ b/agent/pkg/resolver/go.sum @@ -219,8 +219,6 @@ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= diff --git a/devops/linux-x86_64-musl-go-libpcap/Dockerfile b/devops/linux-x86_64-musl-go-libpcap/Dockerfile new file mode 100644 index 000000000..b82454453 --- /dev/null +++ b/devops/linux-x86_64-musl-go-libpcap/Dockerfile @@ -0,0 +1,31 @@ +FROM messense/rust-musl-cross:x86_64-musl AS builder-from-arm64v8-to-amd64 + +ENV CROSS_TRIPLE x86_64-unknown-linux-musl +ENV CROSS_ROOT /usr/local/musl + +ENV AS=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-as \ + AR=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-ar \ + CC=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-gcc \ + CPP=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-cpp \ + CXX=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-g++ \ + LD=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-ld \ + FC=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-gfortran + +# Install Go +WORKDIR / +RUN curl https://go.dev/dl/go1.17.6.linux-arm64.tar.gz -Lo ./go.linux-arm64.tar.gz \ + && curl https://go.dev/dl/go1.17.6.linux-arm64.tar.gz.asc -Lo ./go.linux-arm64.tar.gz.asc \ + && curl https://dl.google.com/dl/linux/linux_signing_key.pub -Lo linux_signing_key.pub \ + && gpg --import linux_signing_key.pub && gpg --verify ./go.linux-arm64.tar.gz.asc ./go.linux-arm64.tar.gz \ + && rm -rf /usr/local/go && tar -C /usr/local -xzf go.linux-arm64.tar.gz +ENV PATH "$PATH:/usr/local/go/bin" + +# Compile libpcap from source +RUN curl https://www.tcpdump.org/release/libpcap-1.10.1.tar.gz -Lo ./libpcap.tar.gz \ + && curl https://www.tcpdump.org/release/libpcap-1.10.1.tar.gz.sig -Lo ./libpcap.tar.gz.sig \ + && curl https://www.tcpdump.org/release/signing-key.asc -Lo ./signing-key.asc \ + && gpg --import signing-key.asc && gpg --verify libpcap.tar.gz.sig libpcap.tar.gz \ + && tar -xzf libpcap.tar.gz && mv ./libpcap-* ./libpcap +WORKDIR /libpcap +RUN ./configure --host=x86_64 && make \ + && cp /libpcap/libpcap.a /usr/local/musl/lib/gcc/x86_64-unknown-linux-musl/*/ diff --git a/devops/linux-x86_64-musl-go-libpcap/build-push.sh b/devops/linux-x86_64-musl-go-libpcap/build-push.sh new file mode 100755 index 000000000..725366a64 --- /dev/null +++ b/devops/linux-x86_64-musl-go-libpcap/build-push.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -e + +docker build . -t up9inc/linux-x86_64-musl-go-libpcap && docker push up9inc/linux-x86_64-musl-go-libpcap diff --git a/tap/extensions/http/go.mod b/tap/extensions/http/go.mod index fc93b8fac..1a8c8ee65 100644 --- a/tap/extensions/http/go.mod +++ b/tap/extensions/http/go.mod @@ -4,6 +4,7 @@ go 1.17 require ( github.com/beevik/etree v1.1.0 + github.com/mertyildiran/gqlparser/v2 v2.4.6 github.com/stretchr/testify v1.7.0 github.com/up9inc/mizu/tap/api v0.0.0 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd diff --git a/tap/extensions/http/go.sum b/tap/extensions/http/go.sum index 78ff0cef0..e9937f66b 100644 --- a/tap/extensions/http/go.sum +++ b/tap/extensions/http/go.sum @@ -1,3 +1,4 @@ +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -5,6 +6,13 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mertyildiran/gqlparser/v2 v2.4.6 h1:enAq4F5PYgW/rYExPNzYt7IYrrZnzrfqdywMA1QdFtM= +github.com/mertyildiran/gqlparser/v2 v2.4.6/go.mod h1:XZId58F+XqRSmoLrdsOLgqA918oNvBzuOORruJWBjDo= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -18,8 +26,10 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tap/extensions/http/graphql.go b/tap/extensions/http/graphql.go new file mode 100644 index 000000000..d350c0f68 --- /dev/null +++ b/tap/extensions/http/graphql.go @@ -0,0 +1,31 @@ +package http + +import ( + "encoding/json" + + "github.com/mertyildiran/gqlparser/v2/ast" + "github.com/mertyildiran/gqlparser/v2/parser" +) + +func isGraphQL(request map[string]interface{}) bool { + if postData, ok := request["postData"].(map[string]interface{}); ok { + if postData["mimeType"] == "application/json" { + if text, ok := postData["text"].(string); ok { + var data map[string]interface{} + if err := json.Unmarshal([]byte(text), &data); err != nil { + return false + } + + if query, ok := data["query"].(string); ok { + + _, err := parser.ParseQuery(&ast.Source{Name: "ff", Input: query}) + if err == nil { + return true + } + } + } + } + } + + return false +} diff --git a/tap/extensions/http/main.go b/tap/extensions/http/main.go index 7b439e021..a6d79bb43 100644 --- a/tap/extensions/http/main.go +++ b/tap/extensions/http/main.go @@ -71,6 +71,34 @@ var grpcProtocol api.Protocol = api.Protocol{ Priority: 0, } +var graphQL1Protocol api.Protocol = api.Protocol{ + Name: "http", + LongName: "Hypertext Transfer Protocol -- HTTP/1.1 [ GraphQL over HTTP/1.1 ]", + Abbreviation: "GQL", + Macro: "gql", + Version: "1.1", + BackgroundColor: "#e10098", + ForegroundColor: "#ffffff", + FontSize: 12, + ReferenceLink: "https://graphql.org/learn/serving-over-http/", + Ports: []string{"80", "443", "8080"}, + Priority: 0, +} + +var graphQL2Protocol api.Protocol = api.Protocol{ + Name: "http", + LongName: "Hypertext Transfer Protocol Version 2 (HTTP/2) [ GraphQL over HTTP/2 ]", + Abbreviation: "GQL", + Macro: "gql", + Version: "2.0", + BackgroundColor: "#e10098", + ForegroundColor: "#ffffff", + FontSize: 12, + ReferenceLink: "https://graphql.org/learn/serving-over-http/", + Ports: []string{"80", "443", "8080", "50051"}, + Priority: 0, +} + const ( TypeHttpRequest = iota TypeHttpResponse @@ -208,6 +236,14 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, } } + if isGraphQL(reqDetails) { + if item.Protocol.Version == "2.0" { + item.Protocol = graphQL2Protocol + } else { + item.Protocol = graphQL1Protocol + } + } + if resDetails["bodySize"].(float64) < 0 { resDetails["bodySize"] = 0 } @@ -481,6 +517,7 @@ func (d dissecting) Macros() map[string]string { `http`: fmt.Sprintf(`proto.name == "%s" and proto.version.startsWith("%c")`, http11protocol.Name, http11protocol.Version[0]), `http2`: fmt.Sprintf(`proto.name == "%s" and proto.version == "%s"`, http11protocol.Name, http2Protocol.Version), `grpc`: fmt.Sprintf(`proto.name == "%s" and proto.version == "%s" and proto.macro == "%s"`, http11protocol.Name, grpcProtocol.Version, grpcProtocol.Macro), + `gql`: fmt.Sprintf(`proto.name == "%s" and proto.macro == "%s"`, graphQL1Protocol.Name, graphQL1Protocol.Macro), } } diff --git a/tap/extensions/http/main_test.go b/tap/extensions/http/main_test.go index 55004e75b..8ffdf41ae 100644 --- a/tap/extensions/http/main_test.go +++ b/tap/extensions/http/main_test.go @@ -47,6 +47,7 @@ func TestMacros(t *testing.T) { "http": `proto.name == "http" and proto.version.startsWith("1")`, "http2": `proto.name == "http" and proto.version == "2.0"`, "grpc": `proto.name == "http" and proto.version == "2.0" and proto.macro == "grpc"`, + "gql": `proto.name == "http" and proto.macro == "gql"`, } dissector := NewDissector() macros := dissector.Macros() diff --git a/tap/tcp_streams_map.go b/tap/tcp_streams_map.go index 05a157ce6..fc96aa5c7 100644 --- a/tap/tcp_streams_map.go +++ b/tap/tcp_streams_map.go @@ -2,6 +2,7 @@ package tap import ( "runtime" + _debug "runtime/debug" "sync" "time" @@ -47,6 +48,7 @@ func (streamMap *tcpStreamMap) CloseTimedoutTcpStreamChannels() { for { <-ticker.C + _debug.FreeOSMemory() streamMap.streams.Range(func(key interface{}, value interface{}) bool { // `*tlsStream` is not yet applicable to this routine. // So, we cast into `(*tcpStream)` and ignore `*tlsStream` diff --git a/ui-common/src/components/ServiceMapModal/ServiceMapModal.tsx b/ui-common/src/components/ServiceMapModal/ServiceMapModal.tsx index 3b93e379f..1fb17ab25 100644 --- a/ui-common/src/components/ServiceMapModal/ServiceMapModal.tsx +++ b/ui-common/src/components/ServiceMapModal/ServiceMapModal.tsx @@ -49,6 +49,7 @@ const protocols = [ { key: "HTTP", value: "HTTP", component: }, { key: "HTTP/2", value: "HTTP/2", component: }, { key: "gRPC", value: "gRPC", component: }, + { key: "GQL", value: "GQL", component: }, { key: "AMQP", value: "AMQP", component: }, { key: "KAFKA", value: "KAFKA", component: }, { key: "REDIS", value: "REDIS", component: },]