feat(ee): serve frontend pages with query-service (#6696)

Serve frontend pages with query-service
This commit is contained in:
Vibhu Pandey 2024-12-23 16:44:48 +05:30 committed by GitHub
parent 5d9a2571df
commit 53b86e4b5c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 72 additions and 33 deletions

View File

@ -57,6 +57,17 @@ jobs:
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Create .env file
run: |
echo 'INTERCOM_APP_ID="${{ secrets.INTERCOM_APP_ID }}"' > frontend/.env
echo 'SEGMENT_ID="${{ secrets.SEGMENT_ID }}"' >> frontend/.env
echo 'SENTRY_AUTH_TOKEN="${{ secrets.SENTRY_AUTH_TOKEN }}"' >> frontend/.env
echo 'SENTRY_ORG="${{ secrets.SENTRY_ORG }}"' >> frontend/.env
echo 'SENTRY_PROJECT_ID="${{ secrets.SENTRY_PROJECT_ID }}"' >> frontend/.env
echo 'SENTRY_DSN="${{ secrets.SENTRY_DSN }}"' >> frontend/.env
echo 'TUNNEL_URL="${{ secrets.TUNNEL_URL }}"' >> frontend/.env
echo 'TUNNEL_DOMAIN="${{ secrets.TUNNEL_DOMAIN }}"' >> frontend/.env
echo 'POSTHOG_KEY="${{ secrets.POSTHOG_KEY }}"' >> frontend/.env
- name: Setup golang - name: Setup golang
uses: actions/setup-go@v4 uses: actions/setup-go@v4
with: with:

View File

@ -98,12 +98,12 @@ build-query-service-static-arm64:
# Steps to build static binary of query service for all platforms # Steps to build static binary of query service for all platforms
.PHONY: build-query-service-static-all .PHONY: build-query-service-static-all
build-query-service-static-all: build-query-service-static-amd64 build-query-service-static-arm64 build-query-service-static-all: build-query-service-static-amd64 build-query-service-static-arm64 build-frontend-static
# Steps to build and push docker image of query service # Steps to build and push docker image of query service
.PHONY: build-query-service-amd64 build-push-query-service .PHONY: build-query-service-amd64 build-push-query-service
# Step to build docker image of query service in amd64 (used in build pipeline) # Step to build docker image of query service in amd64 (used in build pipeline)
build-query-service-amd64: build-query-service-static-amd64 build-query-service-amd64: build-query-service-static-amd64 build-frontend-static
@echo "------------------" @echo "------------------"
@echo "--> Building query-service docker image for amd64" @echo "--> Building query-service docker image for amd64"
@echo "------------------" @echo "------------------"

11
conf/defaults.yaml Normal file
View File

@ -0,0 +1,11 @@
##################### SigNoz Configuration Defaults #####################
#
# Do not modify this file
#
##################### Web #####################
web:
# The prefix to serve web on
prefix: /
# The directory containing the static build files.
directory: /etc/signoz/web

View File

@ -23,6 +23,9 @@ COPY pkg/query-service/templates /root/templates
# Make query-service executable for non-root users # Make query-service executable for non-root users
RUN chmod 755 /root /root/query-service RUN chmod 755 /root /root/query-service
# Copy frontend
COPY frontend/build/ /etc/signoz/web/
# run the binary # run the binary
ENTRYPOINT ["./query-service"] ENTRYPOINT ["./query-service"]

View File

@ -32,6 +32,7 @@ import (
baseauth "go.signoz.io/signoz/pkg/query-service/auth" baseauth "go.signoz.io/signoz/pkg/query-service/auth"
"go.signoz.io/signoz/pkg/query-service/migrate" "go.signoz.io/signoz/pkg/query-service/migrate"
v3 "go.signoz.io/signoz/pkg/query-service/model/v3" v3 "go.signoz.io/signoz/pkg/query-service/model/v3"
"go.signoz.io/signoz/pkg/web"
licensepkg "go.signoz.io/signoz/ee/query-service/license" licensepkg "go.signoz.io/signoz/ee/query-service/license"
"go.signoz.io/signoz/ee/query-service/usage" "go.signoz.io/signoz/ee/query-service/usage"
@ -107,7 +108,7 @@ func (s Server) HealthCheckStatus() chan healthcheck.Status {
} }
// NewServer creates and initializes Server // NewServer creates and initializes Server
func NewServer(serverOptions *ServerOptions) (*Server, error) { func NewServer(serverOptions *ServerOptions, web *web.Web) (*Server, error) {
modelDao, err := dao.InitDao("sqlite", baseconst.RELATIONAL_DATASOURCE_PATH) modelDao, err := dao.InitDao("sqlite", baseconst.RELATIONAL_DATASOURCE_PATH)
if err != nil { if err != nil {
@ -289,7 +290,7 @@ func NewServer(serverOptions *ServerOptions) (*Server, error) {
usageManager: usageManager, usageManager: usageManager,
} }
httpServer, err := s.createPublicServer(apiHandler) httpServer, err := s.createPublicServer(apiHandler, web)
if err != nil { if err != nil {
return nil, err return nil, err
@ -338,7 +339,7 @@ func (s *Server) createPrivateServer(apiHandler *api.APIHandler) (*http.Server,
}, nil }, nil
} }
func (s *Server) createPublicServer(apiHandler *api.APIHandler) (*http.Server, error) { func (s *Server) createPublicServer(apiHandler *api.APIHandler, web *web.Web) (*http.Server, error) {
r := baseapp.NewRouter() r := baseapp.NewRouter()
@ -382,6 +383,11 @@ func (s *Server) createPublicServer(apiHandler *api.APIHandler) (*http.Server, e
handler = handlers.CompressHandler(handler) handler = handlers.CompressHandler(handler)
err := web.AddToRouter(r)
if err != nil {
return nil, err
}
return &http.Server{ return &http.Server{
Handler: handler, Handler: handler,
}, nil }, nil

View File

@ -10,13 +10,17 @@ import (
"syscall" "syscall"
"time" "time"
"go.opentelemetry.io/collector/confmap"
"go.opentelemetry.io/otel/sdk/resource" "go.opentelemetry.io/otel/sdk/resource"
semconv "go.opentelemetry.io/otel/semconv/v1.4.0" semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
"go.signoz.io/signoz/ee/query-service/app" "go.signoz.io/signoz/ee/query-service/app"
signozconfig "go.signoz.io/signoz/pkg/config"
"go.signoz.io/signoz/pkg/confmap/provider/signozenvprovider"
"go.signoz.io/signoz/pkg/query-service/auth" "go.signoz.io/signoz/pkg/query-service/auth"
baseconst "go.signoz.io/signoz/pkg/query-service/constants" baseconst "go.signoz.io/signoz/pkg/query-service/constants"
"go.signoz.io/signoz/pkg/query-service/migrate" "go.signoz.io/signoz/pkg/query-service/migrate"
"go.signoz.io/signoz/pkg/query-service/version" "go.signoz.io/signoz/pkg/query-service/version"
signozweb "go.signoz.io/signoz/pkg/web"
"google.golang.org/grpc" "google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/credentials/insecure"
@ -131,6 +135,23 @@ func main() {
version.PrintVersion() version.PrintVersion()
config, err := signozconfig.New(context.Background(), signozconfig.ProviderSettings{
ResolverSettings: confmap.ResolverSettings{
URIs: []string{"signozenv:"},
ProviderFactories: []confmap.ProviderFactory{
signozenvprovider.NewFactory(),
},
},
})
if err != nil {
zap.L().Fatal("Failed to create config", zap.Error(err))
}
web, err := signozweb.New(zap.L(), config.Web)
if err != nil {
zap.L().Fatal("Failed to create web", zap.Error(err))
}
serverOptions := &app.ServerOptions{ serverOptions := &app.ServerOptions{
HTTPHostPort: baseconst.HTTPHostPort, HTTPHostPort: baseconst.HTTPHostPort,
PromConfigPath: promConfigPath, PromConfigPath: promConfigPath,
@ -165,7 +186,7 @@ func main() {
zap.L().Info("Migration successful") zap.L().Info("Migration successful")
} }
server, err := app.NewServer(serverOptions) server, err := app.NewServer(serverOptions, web)
if err != nil { if err != nil {
zap.L().Fatal("Failed to create server", zap.Error(err)) zap.L().Fatal("Failed to create server", zap.Error(err))
} }

View File

@ -3,10 +3,19 @@ package config
import ( import (
"context" "context"
signozconfmap "go.signoz.io/signoz/pkg/confmap"
"go.signoz.io/signoz/pkg/instrumentation" "go.signoz.io/signoz/pkg/instrumentation"
"go.signoz.io/signoz/pkg/web" "go.signoz.io/signoz/pkg/web"
) )
// This map contains the default values of all config structs
var (
defaults = map[string]signozconfmap.Config{
"instrumentation": &instrumentation.Config{},
"web": &web.Config{},
}
)
// Config defines the entire configuration of signoz. // Config defines the entire configuration of signoz.
type Config struct { type Config struct {
Instrumentation instrumentation.Config `mapstructure:"instrumentation"` Instrumentation instrumentation.Config `mapstructure:"instrumentation"`
@ -21,15 +30,3 @@ func New(ctx context.Context, settings ProviderSettings) (*Config, error) {
return provider.Get(ctx) return provider.Get(ctx)
} }
func byName(name string) (any, bool) {
switch name {
case "instrumentation":
return &instrumentation.Config{}, true
case "web":
return &web.Config{}, true
default:
return nil, false
}
}

View File

@ -4,7 +4,6 @@ import (
"fmt" "fmt"
"go.opentelemetry.io/collector/confmap" "go.opentelemetry.io/collector/confmap"
signozconfmap "go.signoz.io/signoz/pkg/confmap"
) )
// unmarshal converts a confmap.Conf into a Config struct. // unmarshal converts a confmap.Conf into a Config struct.
@ -19,22 +18,14 @@ func unmarshal(conf *confmap.Conf) (*Config, error) {
parsed := make(map[string]any) parsed := make(map[string]any)
for k := range raw { // To help the defaults kick in, we need iterate over the default map instead of the raw values
e, ok := byName(k) for k, v := range defaults {
if !ok {
return nil, fmt.Errorf("cannot find config with name %q", k)
}
i, ok := e.(signozconfmap.Config)
if !ok {
return nil, fmt.Errorf("config %q does not implement \"signozconfmap.Config\"", k)
}
sub, err := conf.Sub(k) sub, err := conf.Sub(k)
if err != nil { if err != nil {
return nil, fmt.Errorf("cannot read config for %q: %w", k, err) return nil, fmt.Errorf("cannot read config for %q: %w", k, err)
} }
d := i.NewWithDefaults() d := v.NewWithDefaults()
if err := sub.Unmarshal(&d); err != nil { if err := sub.Unmarshal(&d); err != nil {
return nil, fmt.Errorf("cannot merge config for %q: %w", k, err) return nil, fmt.Errorf("cannot merge config for %q: %w", k, err)
} }

View File

@ -9,7 +9,7 @@ import (
"go.signoz.io/signoz/pkg/instrumentation" "go.signoz.io/signoz/pkg/instrumentation"
) )
func TestUnmarshal(t *testing.T) { func TestUnmarshalForInstrumentation(t *testing.T) {
input := confmap.NewFromStringMap( input := confmap.NewFromStringMap(
map[string]any{ map[string]any{
"instrumentation": map[string]any{ "instrumentation": map[string]any{
@ -29,6 +29,5 @@ func TestUnmarshal(t *testing.T) {
cfg, err := unmarshal(input) cfg, err := unmarshal(input)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, expected, cfg) assert.Equal(t, expected.Instrumentation, cfg.Instrumentation)
} }