как использовать Google Analytics Data API v1 с golang

нет демонстрационного кода golang для использования Google Analytics Data API v1 .в https://developers.google.com/analytics/devguides/reporting/data/v1/quickstart-client-libraries

когда я пишу код golang для использования Analytics Data API v1, возникает ошибка, как показано ниже:

      C:\Users\qiuskill\go\src\google_api_test>go run main.go
&{0xc0001ac700}
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x1114c1d]

goroutine 1 [running]:
google.golang.org/grpc/internal/grpcsync.(*Event).HasFired(...)
        C:/Users/qiuskill/go/pkg/mod/google.golang.org/grpc@v1.40.1/internal/grpcsync/event.go:55
google.golang.org/grpc.(*ClientConn).waitForResolvedAddrs(0xc00011bd20, {0x12b3670, 0xc000022050})
        C:/Users/qiuskill/go/pkg/mod/google.golang.org/grpc@v1.40.1/clientconn.go:573 +0x3d
google.golang.org/grpc.newClientStream({0x12b3670, 0xc000022050}, 0x15b3a60, 0xc0001ac700, {0x1237a5c, 0xa}, {0x0, 0x0, 0x0})
        C:/Users/qiuskill/go/pkg/mod/google.golang.org/grpc@v1.40.1/stream.go:177 +0x133
google.golang.org/grpc.invoke({0x12b3670, 0xc000022050}, {0x1237a5c, 0xe0}, {0x1207460, 0xc0001e6000}, {0x11ffe20, 0xc0001e8000}, 0x0, {0x0, ...})
        C:/Users/qiuskill/go/pkg/mod/google.golang.org/grpc@v1.40.1/call.go:66 +0x7d
google.golang.org/grpc.(*ClientConn).Invoke(0x20aa1a80108, {0x12b3670, 0xc000022050}, {0x1237a5c, 0x0}, {0x1207460, 0xc0001e6000}, {0x11ffe20, 0xc0001e8000}, {0x0, ...})
        C:/Users/qiuskill/go/pkg/mod/google.golang.org/grpc@v1.40.1/call.go:37 +0x265
google.golang.org/genproto/googleapis/analytics/data/v1beta.(*betaAnalyticsDataClient).RunReport(0xc00005ba50, {0x12b3670, 0xc000022050}, 0x1, {0x0, 0x0, 0x0})
        C:/Users/qiuskill/go/pkg/mod/google.golang.org/genproto@v0.0.0-20220112215332-a9c7c0acf9f2/googleapis/analytics/data/v1beta/analytics_data_api.pb.go:2407 +0xce
main.main()
        C:/Users/qiuskill/go/src/google_api_test/main.go:76 +0x28d
exit status 2

ниже мой исходный код, я использую ******* вместо своего идентификатора свойства:

      package main

import (
    "context"
    "fmt"

    data "google.golang.org/genproto/googleapis/analytics/data/v1beta"
    "google.golang.org/grpc"
)

func main() {
    cc := &grpc.ClientConn{}
    // fmt.Println(cc)

    client := data.NewBetaAnalyticsDataClient(cc)
    fmt.Println(client)

    ctx := context.Background()

    runReportRequest := &data.RunReportRequest{
        Property: "properties/*******",
        DateRanges: []*data.DateRange{
            {StartDate: "2022-01-10", EndDate: "2022-01-10"},
        },
        Dimensions: []*data.Dimension{
            {Name: "city"},
        },
        Metrics: []*data.Metric{
            {Name: "activeUsers"},
        },
    }
    // fmt.Println(runReportRequest)
    _, err := client.RunReport(ctx, runReportRequest)
    if err != nil {
        panic(err)
    } else {
        // cnt := response.RowCount
        // println(string(cnt))
    }
}

Может ли кто-нибудь знать, в чем причина возникновения ошибки, или кто-нибудь может написать демонстрацию golang для использования Google Analytics Data API v1, дождитесь ваших ответов, большое спасибо !!!

2 ответа

Это сработало для меня

      package libraries

import (
    "context"
    "fmt"
    "log"

    data "google.golang.org/genproto/googleapis/analytics/data/v1beta"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"
    "google.golang.org/grpc/credentials/oauth"
)

const (
    propertyID             = "12312312321"
    serviceAccountJsonPath = "path/to/your/service_account/json/key/file"
)


func get_data_analytics() {
    // Load service account credentials from JSON key file
    creds, err := oauth.NewServiceAccountFromFile(serviceAccountJsonPath, "https://www.googleapis.com/auth/analytics.readonly")
    if err != nil {
        log.Fatalf("Failed to load credentials: %v", err)
    }

    // Create a gRPC connection with credentials
    conn, err := grpc.Dial(
        "analyticsdata.googleapis.com:443",
        grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")),
        grpc.WithPerRPCCredentials(creds),
    )
    if err != nil {
        log.Fatalf("Failed to create connection: %v", err)
    }
    defer conn.Close()

    // Create a client for the Analytics Data API
    client := data.NewBetaAnalyticsDataClient(conn)

    // Make a request to the GA4 Data API
    request := &data.RunReportRequest{
        Property: "properties/" + propertyID,
        Dimensions: []*data.Dimension{
            {Name: "eventName"}, // change according to your needs
        },
        Metrics: []*data.Metric{
            {Name: "eventCount"}, // change according to your needs
            {Name: "totalUsers"}, // change according to your needs
        },
        DateRanges: []*data.DateRange{
            {
                StartDate: time.Now().AddDate(0, 0, -28).Format("2006-01-02"), // change according to your needs
                EndDate: time.Now().Format("2006-01-02"), // change according to your needs
            },
        },
    }

    response, err := client.RunReport(context.Background(), request)
    if err != nil {
        log.Fatalf("Failed to run report: %v", err)
    }

    fmt.Println("Report result:")
    for _, row := range response.Rows {
        // fmt.Printf("%s, %v\n", row.DimensionValues[0].GetValue(), row.MetricValues[0].GetValue())
        fmt.Printf("%s, Event Count: %v, Active Users: %v\n", row.DimensionValues[0].GetValue(), row.MetricValues[0].GetValue(), row.MetricValues[1].GetValue())
    }
}

Бонусный контент , вот как можно использовать DimensionFilter

Одно значение

      dimensionFilter := &data.Filter{
        FieldName: "eventName",
        OneFilter: &data.Filter_StringFilter_{
            StringFilter: &data.Filter_StringFilter{
                MatchType:     data.Filter_StringFilter_EXACT,
                Value:         "banner click",
                CaseSensitive: false,
            },
        },
    }

    // Make a request to the GA4 Data API
    request := &data.RunReportRequest{
        Property: "properties/" + propertyID,
        Dimensions: []*data.Dimension{
            {Name: "eventName"},
        },
        Metrics: []*data.Metric{
            {Name: "eventCount"},
            {Name: "totalUsers"},
        },
        DateRanges: []*data.DateRange{
            {
                StartDate: "2023-10-30",
                EndDate: "2023-11-26",
            },
        },

        DimensionFilter: &data.FilterExpression{
            Expr: &data.FilterExpression_Filter{
                Filter: dimensionFilter,
            },
        },
    }

Множественное значение

      // Create two filter expressions for each event name
    eventNameFilter1 := &data.Filter{
        FieldName: "eventName",
        OneFilter: &data.Filter_StringFilter_{
            StringFilter: &data.Filter_StringFilter{
                MatchType:     data.Filter_StringFilter_EXACT,
                Value:         "banner_click",
                CaseSensitive: false,
            },
        },
    }

    eventNameFilter2 := &data.Filter{
        FieldName: "eventName",
        OneFilter: &data.Filter_StringFilter_{
            StringFilter: &data.Filter_StringFilter{
                MatchType:     data.Filter_StringFilter_EXACT,
                Value:         "header_click",
                CaseSensitive: false,
            },
        },
    }

    // Create an OR group to combine the two filter expressions
    orGroup := &data.FilterExpression_OrGroup{
        OrGroup: &data.FilterExpressionList{
            Expressions: []*data.FilterExpression{
                {Expr: &data.FilterExpression_Filter{Filter: eventNameFilter1}},
                {Expr: &data.FilterExpression_Filter{Filter: eventNameFilter2}},
            },
        },
    }


    // Make a request to the GA4 Data API
    request := &data.RunReportRequest{
        Property: "properties/" + propertyID,
        Dimensions: []*data.Dimension{
            {Name: "eventName"},
        },
        Metrics: []*data.Metric{
            {Name: "eventCount"},
            {Name: "totalUsers"},
        },
        DateRanges: []*data.DateRange{
            {
                StartDate: "2023-10-30",
                EndDate: "2023-11-26",
            },
        },
        DimensionFilter: &data.FilterExpression{
            Expr: orGroup,
        },
    }

Это рабочий пример:

      package main

import (
    "context"
    "fmt"
    "github.com/labstack/echo/v4"
    ga "google.golang.org/api/analyticsdata/v1beta"
    "google.golang.org/api/option"
    "net/http"
)

func main() {
    ctx := context.Background()
    client, err := ga.NewService(ctx, option.WithCredentialsFile("client.json"))

    if err != nil {
        panic(err)
    }

    runReportRequest := &ga.RunReportRequest{
        DateRanges: []*ga.DateRange{
            {
                StartDate: "2022-04-19",
                EndDate: "today"
            },
        },
        //Dimensions: []*data.Dimension{
        //    {
        //        Name: "city"
        //    },
        //},
        Metrics: []*ga.Metric{
            {
                Name: "activeUsers"
            },
        },
    }

    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        r, _ := client.Properties.RunReport("properties/xxxxxxx", runReportRequest).Do()

        fmt.Println(r)

        return c.JSON(http.StatusOK, r.Rows)
    })
    e.Logger.Fatal(e.Start(":1323"))
}
Другие вопросы по тегам