Back

Step by Step Guide to Building a Looker API Integration in Go

Aug 9, 20247 minute read

Introduction

Hey there, fellow developer! Ready to dive into the world of Looker API integration using Go? You're in for a treat. Looker's API is a powerhouse for data analytics, and Go's simplicity and performance make it a perfect match. Let's get cracking!

Prerequisites

Before we jump in, make sure you've got:

  • Go installed (you're a pro, so I'm sure you do)
  • Looker API credentials (if you don't, bug your admin!)
  • Your favorite code editor ready to roll

Setting up the project

Let's kick things off:

mkdir looker-go-integration cd looker-go-integration go mod init github.com/yourusername/looker-go-integration

Now, let's grab the Looker SDK:

go get github.com/looker-open-source/sdk-codegen/go/sdk

Authentication

Time to get cozy with Looker. We'll use API3 Key authentication:

package main import ( "context" "log" "github.com/looker-open-source/sdk-codegen/go/sdk/v4" ) func main() { apiSettings := sdk.ApiSettings{ BaseUrl: "https://your-looker-instance.com:19999", ApiVersion: "4.0", ClientId: "your-client-id", ClientSecret: "your-client-secret", } client, err := sdk.NewLookerSDK(apiSettings) if err != nil { log.Fatalf("Error creating client: %v", err) } // You're in! Let's do some cool stuff. }

Basic API Operations

Now that we're in, let's flex those API muscles:

// Fetch user info me, err := client.Me(context.Background(), "", nil) if err != nil { log.Fatalf("Error fetching user info: %v", err) } log.Printf("Hello, %s!", me.FirstName) // List dashboards dashboards, err := client.AllDashboards(context.Background(), "", nil) if err != nil { log.Fatalf("Error fetching dashboards: %v", err) } log.Printf("Found %d dashboards", len(dashboards)) // Run a query query := sdk.WriteQuery{ Model: "your_model", Fields: []string{"dimension1", "measure1"}, Limit: 10, } result, err := client.RunInlineQuery(context.Background(), "json", query, nil) if err != nil { log.Fatalf("Error running query: %v", err) } log.Printf("Query result: %s", string(result))

Advanced Operations

Ready for the big leagues? Let's create a look and schedule a dashboard:

// Create a look newLook := sdk.WriteLookWithQuery{ Title: "My Awesome Look", Query: &sdk.WriteQuery{ Model: "your_model", Fields: []string{"dimension1", "measure1"}, }, } createdLook, err := client.CreateLook(context.Background(), newLook, nil) if err != nil { log.Fatalf("Error creating look: %v", err) } log.Printf("Created look with ID: %d", createdLook.Id) // Schedule a dashboard schedule := sdk.WriteScheduledPlan{ Name: "Daily Dashboard Email", DashboardId: 123, // Replace with your dashboard ID CronTab: "0 8 * * *", // 8 AM daily Filters: "{\"date\": \"7 days\"}", } createdSchedule, err := client.CreateScheduledPlan(context.Background(), schedule, nil) if err != nil { log.Fatalf("Error creating schedule: %v", err) } log.Printf("Created schedule with ID: %d", createdSchedule.Id)

Error Handling and Best Practices

Always be prepared for the unexpected:

func makeApiCall() error { // Your API call here return nil } if err := makeApiCall(); err != nil { switch e := err.(type) { case *sdk.Error: log.Printf("Looker API error: %s", e.Message) default: log.Printf("Unexpected error: %v", err) } }

Don't forget about rate limiting! Implement exponential backoff or use a rate limiting library to play nice with Looker's servers.

Testing

Test like your life depends on it (because your code's life does):

func TestFetchDashboards(t *testing.T) { mockClient := &MockLookerClient{} mockClient.On("AllDashboards", mock.Anything, mock.Anything, mock.Anything).Return([]sdk.Dashboard{{Id: 1, Title: "Test Dashboard"}}, nil) dashboards, err := fetchDashboards(mockClient) assert.NoError(t, err) assert.Len(t, dashboards, 1) assert.Equal(t, "Test Dashboard", dashboards[0].Title) }

Deployment Considerations

Keep those credentials safe! Use environment variables:

apiSettings := sdk.ApiSettings{ BaseUrl: os.Getenv("LOOKER_BASE_URL"), ApiVersion: os.Getenv("LOOKER_API_VERSION"), ClientId: os.Getenv("LOOKER_CLIENT_ID"), ClientSecret: os.Getenv("LOOKER_CLIENT_SECRET"), }

Consider containerizing your app for easy deployment and scaling.

Conclusion

And there you have it! You've just built a robust Looker API integration in Go. From authentication to advanced operations, you're now equipped to harness the full power of Looker programmatically.

Remember, the Looker API is vast and powerful. This guide is just the tip of the iceberg, so don't be afraid to dive deeper into the official Looker API documentation for more advanced features.

Now go forth and analyze that data like a boss! Happy coding!