小编Tho*_*ach的帖子

比较 Go 单元测试中的 2 个错误

我遇到了如下问题:编写单元测试时比较 2 个错误

package main

import (
    "errors"
    "fmt"
    "reflect"
    
    "github.com/google/go-cmp/cmp"
    "github.com/google/go-cmp/cmp/cmpopts"
)

func main() {
    er1 := errors.New("database name is not exists")
    er2 := errors.New("database name is not exists")
    
    result1 := reflect.DeepEqual(er1, er2)
    fmt.Println("reflect: ", result1)
    
    result2 := cmp.Equal(er1, er2, cmpopts.EquateErrors())
    fmt.Println("compare: ", result2)
    
    result3 := errors.Is(er1, er2)
    fmt.Println("errorIs: ", result3)
}
Run Code Online (Sandbox Code Playgroud)

上面代码的输出是:

reflect:  true
compare:  false
errorIs:  false
Run Code Online (Sandbox Code Playgroud)

我想比较 2 个错误,这reflect.DeepEqual(er1, er2)是我应用的第一种方法,此方法产生我想要的输出,但此方法有一个警告go lint

avoid using reflect.DeepEqual with errorsdeepequalerrors
Run Code Online (Sandbox Code Playgroud)

经过谷歌搜索,有人告诉我一些方法:

  • 使用cmp包进行比较:cmp.Equal(er1, er2, cmpopts.EquateErrors())
  • 使用errors包来比较: …

go

7
推荐指数
1
解决办法
4793
查看次数

Kubernetes 将时间戳添加到每个 docker 容器日志条目中

我有2个集群

  1. Server Version: version.Info{Major:"1", Minor:"20+", GitVersion:"v1.20.11-eks-f17b81", GitCommit:"f17b810c9e5a82200d28b6210b458497ddfcf31b", GitTreeState:"clean", BuildDate:"2021-10-15T21:46:21Z", GoVersion:"go1.15.15", Compiler:"gc", Platform:"linux/amd64"}

  2. Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.6-gke.1500", GitCommit:"7ce0f9f1939dfc1aee910732e84cba03840df91e", GitTreeState:"clean", BuildDate:"2021-11-17T09:30:26Z", GoVersion:"go1.16.9b7", Compiler:"gc", Platform:"linux/amd64"}

我用来fluent-bit尾部容器日志文件并将日志推送到elasticsearch

在第一个 k8s 集群中,容器日志的格式为:

{"log":"{\"method\":\"GET\",\"path\":\"/healthz\",\"format\":\"*/*\",\"controller\":\"Api::ApplicationController\",\"action\":\"healthz\",\"status\":204,\"duration\":0.61,\"view\":0.0,\"request_id\":\"4d54cc06-08d2-4487-b2d9-fabfb2286e89\",\"headers\":{\"SCRIPT_NAME\":\"\",\"QUERY_STRING\":\"\",\"SERVER_PROTOCOL\":\"HTTP/1.1\",\"SERVER_SOFTWARE\":\"puma 5.4.0 Super Flight\",\"GATEWAY_INTERFACE\":\"CGI/1.2\",\"REQUEST_METHOD\":\"GET\",\"REQUEST_PATH\":\"/healthz\",\"REQUEST_URI\":\"/healthz\",\"HTTP_VERSION\":\"HTTP/1.1\",\"HTTP_HOST\":\"192.168.95.192:80\",\"HTTP_USER_AGENT\":\"kube-probe/1.20+\",\"HTTP_ACCEPT\":\"*/*\",\"HTTP_CONNECTION\":\"close\",\"SERVER_NAME\":\"192.168.95.192\",\"SERVER_PORT\":\"80\",\"PATH_INFO\":\"/healthz\",\"REMOTE_ADDR\":\"192.168.79.131\",\"ROUTES_19640_SCRIPT_NAME\":\"\",\"ORIGINAL_FULLPATH\":\"/healthz\",\"ORIGINAL_SCRIPT_NAME\":\"\"},\"params\":{\"controller\":\"api/application\",\"action\":\"healthz\"},\"response\":{},\"custom\":{},\"@version\":\"dutycast-b2c-backend-v1.48.0-rc.5\",\"@timestamp\":\"2022-03-04T11:16:14.236Z\",\"message\":\"[204] GET /healthz (Api::ApplicationController#healthz)\"}\n","stream":"stdout","time":"2022-03-04T11:16:14.238067813Z"}
Run Code Online (Sandbox Code Playgroud)

它是 json 格式,我可以使用fluent-bit解析器轻松解析

我对第二个 k8s 集群执行相同的行为,但容器日志的格式是:

2022-03-04T11:19:24.050132912Z stdout F {"method":"GET","path":"/healthz","format":"*/*","controller":"Public::PublicPagesController","action":"healthz","status":204,"duration":0.52,"view":0.0,"request_id":"bcc799bb-5e5c-4758-9169-ecebb04b801f","headers":{"SCRIPT_NAME":"","QUERY_STRING":"","SERVER_PROTOCOL":"HTTP/1.1","SERVER_SOFTWARE":"puma 5.6.2 Birdie's Version","GATEWAY_INTERFACE":"CGI/1.2","REQUEST_METHOD":"GET","REQUEST_PATH":"/healthz","REQUEST_URI":"/healthz","HTTP_VERSION":"HTTP/1.1","HTTP_HOST":"10.24.0.22:3000","HTTP_USER_AGENT":"kube-probe/1.21","HTTP_ACCEPT":"*/*","HTTP_CONNECTION":"close","SERVER_NAME":"10.24.0.22","SERVER_PORT":"3000","PATH_INFO":"/healthz","REMOTE_ADDR":"10.24.0.1","ROUTES_71860_SCRIPT_NAME":"","ORIGINAL_FULLPATH":"/healthz","ORIGINAL_SCRIPT_NAME":"","ROUTES_71820_SCRIPT_NAME":""},"params":{"controller":"public/public_pages","action":"healthz"},"custom":null,"request_time":"2022-03-04T11:19:24.048+00:00","process_id":8,"@version":"vcam-backend-v0.1.0-rc24","response":"#\u003cActionDispatch::Response:0x00007f9d1f600888 @mon_data=#\u003cMonitor:0x00007f9d1f600838\u003e, @mon_data_owner_object_id=144760, @header={\"X-Frame-Options\"=\u003e\"ALLOW-FROM https://vietcapital.com.vn\", \"X-XSS-Protection\"=\u003e\"0\", \"X-Content-Type-Options\"=\u003e\"nosniff\", \"X-Download-Options\"=\u003e\"noopen\", \"X-Permitted-Cross-Domain-Policies\"=\u003e\"none\", \"Referrer-Policy\"=\u003e\"strict-origin-when-cross-origin\"}, @stream=#\u003cActionDispatch::Response::Buffer:0x00007f9d1f6045a0 @response=#\u003cActionDispatch::Response:0x00007f9d1f600888 ...\u003e, @buf=[\"\"], @closed=false, @str_body=nil\u003e, @status=204, @cv=#\u003cMonitorMixin::ConditionVariable:0x00007f9d1f600720 @monitor=#\u003cMonitor:0x00007f9d1f600838\u003e, @cond=#\u003cThread::ConditionVariable:0x00007f9d1f6006f8\u003e\u003e, @committed=false, @sending=false, @sent=false, @cache_control={}, @request=#\u003cActionDispatch::Request GET \"http://10.24.0.22:3000/healthz\" for 10.24.0.1\u003e\u003e","@timestamp":"2022-03-04T11:19:24.049Z","message":"[204] …
Run Code Online (Sandbox Code Playgroud)

elasticsearch kubernetes fluent-bit

7
推荐指数
0
解决办法
631
查看次数

Google Cloud SQL:在“连接”部分编辑实例(PostgreSQL)是否会导致数据库停机?

我有一个用于生产 Web 应用程序的 PostgreSQL 11 实例。现在,我想修改连接部分以使用内部 IP 并禁用公共连接。此活动是否会导致我们的数据库出现一些停机时间?

我自己有客人:

  1. GCP 仅更改此实例的网络部分,因此我们可以获得零停机时间。

  2. GCP 将重新配置托管此 PostgreSQL 的实例,这会给我们的数据库带来一些停机时间,这是我们在生产中不希望出现的情况。

提前谢谢!

postgresql google-cloud-sql google-cloud-platform devops

5
推荐指数
1
解决办法
1233
查看次数

如何在 Golang 中验证 JWT 令牌

我想检查 JWT 是否是从我们的服务器生成的?

我使用 JWT 进行身份验证并使用 RS256 作为 JWT 的算法

现在,我想在 Golang 中编写一个函数来验证 JWT 令牌是否是我们的。下面是我已经实现的代码:

    publicKey = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAxxxxxxf2iF+20xHTZ4jTUBzYmikBuUsm0839T5SDmwEquTB\nfQIDAQAB\n-----END PUBLIC KEY-----\n"


    // sample token string taken from the New example
    tokenString := this.JWT[0]

    claims := jwt.MapClaims{}
    token, err := jwt.ParseWithClaims(tokenString, &claims, func(token *jwt.Token) (interface{}, error) {
        return []byte(publicKey), nil
    })

    // ... error handling
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println("TOKEN is:", token.Valid)

    // do something with decoded claims
    for key, val := range claims {
        fmt.Printf("Key: %v, …
Run Code Online (Sandbox Code Playgroud)

go jwt jwt-go

5
推荐指数
1
解决办法
6419
查看次数

kubectl logs 命令中的 Kubernetes 日志与 GKE 集群中的 /var/log/containers 不同

我在 GCP 上创建了一个 GKE 集群。

kubectl logs 命令中的 Kubernetes 日志与 /var/log/containers 不同

库贝克特尔

{"method":"GET","path":"/healthz","format":"*/*","controller":"Public::PublicPagesController","action":"healthz","status":204,"duration":0.39,"view":0.0,"request_id":"ca29b519-d1e8-49a2-95ae-e5f23b60c36f","params":{},"custom":null,"request_time":"2022-04-27T15:25:43.780+00:00","process_id":6,"@version":"vcam-backend-vvcam-72_shareholder_event-rc16","@timestamp":"2022-04-27T15:25:43.780Z","message":"[204] GET /healthz (Public::PublicPagesController#healthz)"}
Run Code Online (Sandbox Code Playgroud)

并登录 /var/log/containers,将时间戳添加到我的容器日志的开头:

2022-04-27T15:25:43.780523421Z stdout F {"method":"GET","path":"/healthz","format":"*/*","controller":"Public::PublicPagesController","action":"healthz","status":204,"duration":0.39,"view":0.0,"request_id":"ca29b519-d1e8-49a2-95ae-e5f23b60c36f","params":{},"custom":null,"request_time":"2022-04-27T15:25:43.780+00:00","process_id":6,"@version":"vcam-backend-vvcam-72_shareholder_event-rc16","@timestamp":"2022-04-27T15:25:43.780Z","message":"[204] GET /healthz (Public::PublicPagesController#healthz)"}
Run Code Online (Sandbox Code Playgroud)

我希望我的应用程序日志保持一致,我希望它采用 json 格式,就像来自 kubectl 命令的日志一样,这样我就可以解析和分析更多内容。

我想删除这部分:2022-04-27T15:25:43.780523421Z stdout F

有人遇到这个问题吗?如何使容器日志与 kubectl 命令日志相同?

GKE 版本:

Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.10-gke.2000", GitCommit:"0823380786b063c3f71d5e7c76826a972e30550d", GitTreeState:"clean", BuildDate:"2022-03-17T09:22:22Z", GoVersion:"go1.16.14b7", Compiler:"gc", Platform:"linux/amd64"}
Run Code Online (Sandbox Code Playgroud)

Docker 守护进程.json

{
  "pidfile": "/var/run/docker.pid",
  "iptables": false,
  "ip-masq": false,
  "log-level": "warn",
  "bip": "169.254.123.1/24",
  "mtu": 1460,
  "storage-driver": "overlay2",
  "live-restore": true,
  "log-driver": "json-file",
  "log-opts": {
      "max-size": "10m",
      "max-file": "5"
    }
} …
Run Code Online (Sandbox Code Playgroud)

logging kubernetes google-kubernetes-engine

5
推荐指数
1
解决办法
1713
查看次数