mirror of
https://github.com/SigNoz/signoz.git
synced 2026-04-23 20:30:31 +01:00
* refactor: moving types to cloud provider specific namespace/pkg * refactor: separating cloud provider types * refactor: using upper case key for AWS
128 lines
4.9 KiB
Go
128 lines
4.9 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.NewAWSConnectionArtifact(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.NewAWSIntegrationConfig(account.Config.AWS.Regions, collectionStrategy),
|
|
}, nil
|
|
}
|