mirror of
https://github.com/SigNoz/signoz.git
synced 2026-04-18 18:00:27 +01:00
* feat: adding cloud integration type for refactor * refactor: store interfaces to use local types and error * feat: adding sql store implementation * refactor: removing interface check * feat: adding updated types for cloud integration * refactor: using struct for map * refactor: update cloud integration types and module interface * fix: correct GetService signature and remove shadowed Data field * feat: implement cloud integration store * refactor: adding comments and removed wrong code * refactor: streamlining types * refactor: add comments for backward compatibility in PostableAgentCheckInRequest * refactor: update Dashboard struct comments and remove unused fields * refactor: split upsert store method * feat: adding integration test * refactor: clean up types * refactor: renaming service type to service id * refactor: using serviceID type * feat: adding method for service id creation * refactor: updating store methods * refactor: clean up * refactor: clean up * refactor: review comments * refactor: clean up * feat: adding handlers * fix: lint and ci issues * fix: lint issues * fix: update error code for service not found * feat: adding handler skeleton * chore: removing todo comment * feat: adding frontend openapi schema * feat: adding module implementation for create account * fix: returning valid error instead of panic * fix: module test * refactor: simplify ingestion key retrieval logic * feat: adding module implementation for AWS * refactor: ci lint changes * refactor: python formatting change * fix: new storable account func was unsetting provider account id * refactor: python lint changes * refactor: adding validation on update account request * refactor: reverting older tests and adding new tests * chore: lint changes * feat: using service account for API key * refactor: renaming tests and cleanup * refactor: removing dashboard overview images * feat: adding service definition store * chore: adding TODO comments * feat: adding API for getting connection credentials * feat: adding openapi spec for the endpoint * feat: adding tests for credential API * feat: adding cloud integration config * refactor: updating test with new env variable for config * refactor: moving few cloud provider interface methods to types * refactor: review comments resolution * refactor: lint changes * refactor: code clean up * refactor: removing email domain function * refactor: review comments and clean up * refactor: lint fixes * refactor: review changes - Added get connected account module method - Fixed integration tests - Removed cloud integration store as callback function's param * refactor: changing wrong dashboard id for EKS definition
133 lines
5.0 KiB
Go
133 lines
5.0 KiB
Go
package implcloudprovider
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/url"
|
|
"sort"
|
|
|
|
"github.com/SigNoz/signoz/pkg/modules/cloudintegration"
|
|
"github.com/SigNoz/signoz/pkg/types/cloudintegrationtypes"
|
|
)
|
|
|
|
type awscloudprovider struct {
|
|
serviceDefinitions cloudintegrationtypes.ServiceDefinitionStore
|
|
}
|
|
|
|
func NewAWSCloudProvider(defStore cloudintegrationtypes.ServiceDefinitionStore) (cloudintegration.CloudProviderModule, error) {
|
|
return &awscloudprovider{serviceDefinitions: defStore}, nil
|
|
}
|
|
|
|
func (provider *awscloudprovider) GetConnectionArtifact(ctx context.Context, account *cloudintegrationtypes.Account, req *cloudintegrationtypes.GetConnectionArtifactRequest) (*cloudintegrationtypes.ConnectionArtifact, error) {
|
|
baseURL := fmt.Sprintf(cloudintegrationtypes.CloudFormationQuickCreateBaseURL.StringValue(), req.Config.Aws.DeploymentRegion)
|
|
u, _ := url.Parse(baseURL)
|
|
|
|
q := u.Query()
|
|
q.Set("region", req.Config.Aws.DeploymentRegion)
|
|
u.Fragment = "/stacks/quickcreate"
|
|
|
|
u.RawQuery = q.Encode()
|
|
|
|
q = u.Query()
|
|
q.Set("stackName", cloudintegrationtypes.AgentCloudFormationBaseStackName.StringValue())
|
|
q.Set("templateURL", fmt.Sprintf(cloudintegrationtypes.AgentCloudFormationTemplateS3Path.StringValue(), req.Config.AgentVersion))
|
|
q.Set("param_SigNozIntegrationAgentVersion", req.Config.AgentVersion)
|
|
q.Set("param_SigNozApiUrl", req.Credentials.SigNozAPIURL)
|
|
q.Set("param_SigNozApiKey", req.Credentials.SigNozAPIKey)
|
|
q.Set("param_SigNozAccountId", account.ID.StringValue())
|
|
q.Set("param_IngestionUrl", req.Credentials.IngestionURL)
|
|
q.Set("param_IngestionKey", req.Credentials.IngestionKey)
|
|
|
|
return &cloudintegrationtypes.ConnectionArtifact{
|
|
Aws: &cloudintegrationtypes.AWSConnectionArtifact{
|
|
ConnectionURL: u.String() + "?&" + q.Encode(), // this format is required by AWS
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (provider *awscloudprovider) ListServiceDefinitions(ctx context.Context) ([]*cloudintegrationtypes.ServiceDefinition, error) {
|
|
return provider.serviceDefinitions.List(ctx, cloudintegrationtypes.CloudProviderTypeAWS)
|
|
}
|
|
|
|
func (provider *awscloudprovider) GetServiceDefinition(ctx context.Context, serviceID cloudintegrationtypes.ServiceID) (*cloudintegrationtypes.ServiceDefinition, error) {
|
|
serviceDef, err := provider.serviceDefinitions.Get(ctx, cloudintegrationtypes.CloudProviderTypeAWS, serviceID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// override cloud integration dashboard id
|
|
for index, dashboard := range serviceDef.Assets.Dashboards {
|
|
serviceDef.Assets.Dashboards[index].ID = cloudintegrationtypes.GetCloudIntegrationDashboardID(cloudintegrationtypes.CloudProviderTypeAWS, serviceID.StringValue(), dashboard.ID)
|
|
}
|
|
|
|
return serviceDef, nil
|
|
}
|
|
|
|
func (provider *awscloudprovider) BuildIntegrationConfig(
|
|
ctx context.Context,
|
|
account *cloudintegrationtypes.Account,
|
|
services []*cloudintegrationtypes.StorableCloudIntegrationService,
|
|
) (*cloudintegrationtypes.ProviderIntegrationConfig, error) {
|
|
// Sort services for deterministic output
|
|
sort.Slice(services, func(i, j int) bool {
|
|
return services[i].Type.StringValue() < services[j].Type.StringValue()
|
|
})
|
|
|
|
compiledMetrics := new(cloudintegrationtypes.AWSMetricsCollectionStrategy)
|
|
compiledLogs := new(cloudintegrationtypes.AWSLogsCollectionStrategy)
|
|
var compiledS3Buckets map[string][]string
|
|
|
|
for _, storedSvc := range services {
|
|
svcCfg, err := cloudintegrationtypes.NewServiceConfigFromJSON(cloudintegrationtypes.CloudProviderTypeAWS, storedSvc.Config)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
svcDef, err := provider.GetServiceDefinition(ctx, storedSvc.Type)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
strategy := svcDef.TelemetryCollectionStrategy.AWS
|
|
logsEnabled := svcCfg.IsLogsEnabled(cloudintegrationtypes.CloudProviderTypeAWS)
|
|
|
|
// S3Sync: logs come directly from configured S3 buckets, not CloudWatch subscriptions
|
|
if storedSvc.Type == cloudintegrationtypes.AWSServiceS3Sync {
|
|
if logsEnabled && svcCfg.AWS.Logs.S3Buckets != nil {
|
|
compiledS3Buckets = svcCfg.AWS.Logs.S3Buckets
|
|
}
|
|
// no need to go ahead as the code block specifically checks for the S3Sync service
|
|
continue
|
|
}
|
|
|
|
if logsEnabled && strategy.Logs != nil {
|
|
compiledLogs.Subscriptions = append(compiledLogs.Subscriptions, strategy.Logs.Subscriptions...)
|
|
}
|
|
|
|
metricsEnabled := svcCfg.IsMetricsEnabled(cloudintegrationtypes.CloudProviderTypeAWS)
|
|
|
|
if metricsEnabled && strategy.Metrics != nil {
|
|
compiledMetrics.StreamFilters = append(compiledMetrics.StreamFilters, strategy.Metrics.StreamFilters...)
|
|
}
|
|
}
|
|
|
|
collectionStrategy := new(cloudintegrationtypes.AWSTelemetryCollectionStrategy)
|
|
|
|
if len(compiledMetrics.StreamFilters) > 0 {
|
|
collectionStrategy.Metrics = compiledMetrics
|
|
}
|
|
if len(compiledLogs.Subscriptions) > 0 {
|
|
collectionStrategy.Logs = compiledLogs
|
|
}
|
|
if compiledS3Buckets != nil {
|
|
collectionStrategy.S3Buckets = compiledS3Buckets
|
|
}
|
|
|
|
return &cloudintegrationtypes.ProviderIntegrationConfig{
|
|
AWS: &cloudintegrationtypes.AWSIntegrationConfig{
|
|
EnabledRegions: account.Config.AWS.Regions,
|
|
TelemetryCollectionStrategy: collectionStrategy,
|
|
},
|
|
}, nil
|
|
}
|