Skip to content

Commit 2caba06

Browse files
committed
Pass params into query for sanitizing
1 parent 75ee43e commit 2caba06

File tree

1 file changed

+87
-93
lines changed

1 file changed

+87
-93
lines changed

src/gprofiler_flamedb_rest/db/clickhouse.go

Lines changed: 87 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -347,15 +347,15 @@ func (c *ClickHouseClient) GetTopFrames(ctx context.Context, params common.Flame
347347
tableNew := getTableName(table, tablePrefix)
348348
go func(sTable string, sStart string, sEnd string) {
349349
defer wg.Done()
350-
query := fmt.Sprintf(`
350+
query := `
351351
SELECT CallStackHash, any(CallStackName), any(CallStackParent), sum(NumSamples)
352-
AS SumNumSamples FROM %s
353-
WHERE ServiceId == '%d' AND (Timestamp BETWEEN '%s' AND '%s') %s
352+
AS SumNumSamples FROM ?
353+
WHERE ServiceId == '?' AND (Timestamp BETWEEN '?' AND '?') ?
354354
GROUP BY CallStackHash
355355
ORDER BY SumNumSamples DESC
356-
LIMIT %d`, sTable, params.ServiceId, sStart, sEnd, conditions, params.StacksNum)
357-
log.Printf("SELECT query: %s", query)
358-
rows, err := c.client.Query(query)
356+
LIMIT ?`
357+
log.Printf("SELECT query: ?", query)
358+
rows, err := c.client.Query(query, sTable, params.ServiceId, sStart, sEnd, conditions, params.StacksNum)
359359
if err == nil {
360360
defer rows.Close()
361361
frames := make(map[uint64]Frame)
@@ -401,13 +401,10 @@ func (c *ClickHouseClient) FetchInstanceTypeCount(ctx context.Context, params co
401401
_, conditions := BuildConditions(params.ContainerName, params.HostName, params.InstanceType, params.K8SObject, filterQuery)
402402
selectQuery = `
403403
SELECT InstanceType, COUNT(DISTINCT HostName) as InstanceCount
404-
FROM flamedb.samples_1min where ServiceId = '%d' AND (Timestamp BETWEEN '%s' AND '%s' )
405-
%s GROUP BY InstanceType ORDER BY InstanceCount DESC`
406-
407-
query := fmt.Sprintf(selectQuery, params.ServiceId, common.FormatTime(params.StartDateTime),
404+
FROM flamedb.samples_1min where ServiceId = '?' AND (Timestamp BETWEEN '?' AND '?' )
405+
? GROUP BY InstanceType ORDER BY InstanceCount DESC`
406+
rows, err := c.client.Query(selectQuery, params.ServiceId, common.FormatTime(params.StartDateTime),
408407
common.FormatTime(params.EndDateTime), conditions)
409-
410-
rows, err := c.client.Query(query)
411408
if err == nil {
412409
defer rows.Close()
413410
for rows.Next() {
@@ -433,12 +430,10 @@ func (c *ClickHouseClient) FetchFieldValueSample(ctx context.Context, field stri
433430
result := make([]common.FilterData, 0)
434431
_, conditions := BuildConditions(params.ContainerName, params.HostName, params.InstanceType, params.K8SObject, filterQuery)
435432
selectQuery = `
436-
SELECT %s, SUM(NumSamples) as samples from flamedb.samples_1min WHERE ServiceId == '%d' AND
437-
(Timestamp BETWEEN '%s' AND '%s') %s GROUP BY %s ORDER BY samples DESC;`
438-
query := fmt.Sprintf(selectQuery, field, params.ServiceId, common.FormatTime(params.StartDateTime),
433+
SELECT ?, SUM(NumSamples) as samples from flamedb.samples_1min WHERE ServiceId == '?' AND
434+
(Timestamp BETWEEN '?' AND '?') ? GROUP BY ? ORDER BY samples DESC;`
435+
rows, err := c.client.Query(query,field, params.ServiceId, common.FormatTime(params.StartDateTime),
439436
common.FormatTime(params.EndDateTime), conditions, field)
440-
441-
rows, err := c.client.Query(query)
442437
if err == nil {
443438
defer rows.Close()
444439
for rows.Next() {
@@ -463,13 +458,13 @@ func (c *ClickHouseClient) FetchFieldValues(ctx context.Context, field string, p
463458
filterQuery string) []common.FilterData {
464459
result := make([]common.FilterData, 0)
465460
_, conditions := BuildConditions(params.ContainerName, params.HostName, params.InstanceType, params.K8SObject, filterQuery)
466-
query := fmt.Sprintf(`
467-
SELECT %s from flamedb.samples_1min WHERE ServiceId == '%d' AND
468-
(Timestamp BETWEEN '%s' AND '%s') %s GROUP BY %s;
469-
`, field, params.ServiceId, common.FormatTime(params.StartDateTime),
470-
common.FormatTime(params.EndDateTime), conditions, field)
461+
query := `
462+
SELECT ? from flamedb.samples_1min WHERE ServiceId == '?' AND
463+
(Timestamp BETWEEN '?' AND '?') ? GROUP BY ?;
464+
`
471465

472-
rows, err := c.client.Query(query)
466+
rows, err := c.client.Query(query, field, params.ServiceId, common.FormatTime(params.StartDateTime),
467+
common.FormatTime(params.EndDateTime), conditions, field)
473468
if err == nil {
474469
defer rows.Close()
475470
for rows.Next() {
@@ -494,15 +489,15 @@ func (c *ClickHouseClient) FetchSampleCount(ctx context.Context, params common.Q
494489
_, conditions := BuildConditions(params.ContainerName, params.HostName, params.InstanceType, params.K8SObject, filterQuery)
495490
interval := getInterval(params.StartDateTime, params.EndDateTime, params.Interval)
496491
result := make([]common.Sample, 0)
497-
query := fmt.Sprintf(`
498-
SELECT toStartOfInterval(Timestamp, INTERVAL '%s') as Datetime, SUM(NumSamples)
492+
query := `
493+
SELECT toStartOfInterval(Timestamp, INTERVAL '?') as Datetime, SUM(NumSamples)
499494
FROM flamedb.samples_1min
500-
WHERE ServiceId == '%d' AND (Timestamp BETWEEN '%s' AND '%s') %s
495+
WHERE ServiceId == '?' AND (Timestamp BETWEEN '?' AND '?') ?
501496
GROUP BY Datetime
502497
ORDER BY Datetime DESC;
503-
`, interval, params.ServiceId, common.FormatTime(params.StartDateTime),
498+
`
499+
rows, err := c.client.Query(query, interval, params.ServiceId, common.FormatTime(params.StartDateTime),
504500
common.FormatTime(params.EndDateTime), conditions)
505-
rows, err := c.client.Query(query)
506501
if err == nil {
507502
defer rows.Close()
508503
for rows.Next() {
@@ -530,29 +525,28 @@ func (c *ClickHouseClient) FetchSampleCountByFunction(ctx context.Context, param
530525
interval = "1 minute"
531526
}
532527
result := make([]common.SamplesCountByFunction, 0)
533-
query := fmt.Sprintf(`
528+
query := `
534529
WITH all_samples as(
535-
SELECT toStartOfInterval(Timestamp, INTERVAL '%s') AS Datetime, SUM(NumSamples) AS sum_cpu
530+
SELECT toStartOfInterval(Timestamp, INTERVAL '?') AS Datetime, SUM(NumSamples) AS sum_cpu
536531
FROM flamedb.samples_1min
537-
WHERE ServiceId == '%d' AND (Timestamp BETWEEN '%s' AND '%s') %s
532+
WHERE ServiceId == '?' AND (Timestamp BETWEEN '?' AND '?') ?
538533
GROUP BY Datetime
539534
ORDER BY Datetime DESC
540535
), function_samples AS (
541-
SELECT toStartOfInterval(Timestamp, INTERVAL '%s') AS Datetime, SUM(NumSamples) AS sum_cpu
536+
SELECT toStartOfInterval(Timestamp, INTERVAL '?') AS Datetime, SUM(NumSamples) AS sum_cpu
542537
FROM flamedb.samples
543-
WHERE ServiceId == '%d' AND (Timestamp BETWEEN '%s' AND '%s') AND (CallStackName = '%s') %s
538+
WHERE ServiceId == '?' AND (Timestamp BETWEEN '?' AND '?') AND (CallStackName = '?') ?
544539
GROUP BY Datetime
545540
ORDER BY Datetime DESC
546541
)
547542
548543
SELECT (function_samples.sum_cpu/all_samples.sum_cpu) AS Samples , all_samples.Datetime AS Datetime
549544
FROM all_samples
550545
LEFT JOIN function_samples ON function_samples.Datetime = all_samples.Datetime;
551-
`, interval, params.ServiceId, common.FormatTime(params.StartDateTime),
546+
`
547+
rows, err := c.client.Query(query, interval, params.ServiceId, common.FormatTime(params.StartDateTime),
552548
common.FormatTime(params.EndDateTime), conditions, interval, params.ServiceId, common.FormatTime(params.StartDateTime),
553549
common.FormatTime(params.EndDateTime), params.FunctionName, conditions)
554-
555-
rows, err := c.client.Query(query)
556550
if err == nil {
557551
defer rows.Close()
558552

@@ -601,14 +595,14 @@ func (c *ClickHouseClient) FetchTimes(ctx context.Context, params common.QueryPa
601595
default:
602596
interval = getInterval(params.StartDateTime, params.EndDateTime, "")
603597
}
604-
query := fmt.Sprintf(`
605-
SELECT toStartOfInterval(Timestamp, INTERVAL '%s') as Datetime
606-
from flamedb.samples_1min WHERE ServiceId == '%d' AND
607-
(Timestamp BETWEEN '%s' AND '%s') %s
598+
query := `
599+
SELECT toStartOfInterval(Timestamp, INTERVAL '?') as Datetime
600+
from flamedb.samples_1min WHERE ServiceId == '?' AND
601+
(Timestamp BETWEEN '?' AND '?') ?
608602
GROUP BY Datetime
609-
ORDER BY Datetime DESC;`, interval, params.ServiceId,
603+
ORDER BY Datetime DESC;`
604+
rows, err := c.client.Query(query, interval, params.ServiceId,
610605
common.FormatTime(params.StartDateTime), common.FormatTime(params.EndDateTime), conditions)
611-
rows, err := c.client.Query(query)
612606
if err == nil {
613607
defer rows.Close()
614608
for rows.Next() {
@@ -631,13 +625,13 @@ func (c *ClickHouseClient) FetchTimeRange(ctx context.Context, params common.Que
631625
result := make([]string, 0)
632626
_, conditions := BuildConditions(params.ContainerName, params.HostName, params.InstanceType, params.K8SObject, filterQuery)
633627

634-
query := fmt.Sprintf(`
628+
query := `
635629
SELECT min(Timestamp), max(Timestamp)
636630
from flamedb.samples_1min WHERE
637-
ServiceId == '%d' AND
638-
(Timestamp BETWEEN '%s' AND '%s') %s;`, params.ServiceId,
631+
ServiceId == '?' AND
632+
(Timestamp BETWEEN '?' AND '?') ?;`
633+
rows, err := c.client.Query(query, params.ServiceId,
639634
common.FormatTime(params.StartDateTime), common.FormatTime(params.EndDateTime), conditions)
640-
rows, err := c.client.Query(query)
641635
if err == nil {
642636
defer rows.Close()
643637
for rows.Next() {
@@ -667,18 +661,18 @@ func (c *ClickHouseClient) FetchMetricsSummary(ctx context.Context, params commo
667661
_, conditions := BuildConditions(defaultEmptyList, params.HostName, params.InstanceType, defaultEmptyList, filterQuery)
668662

669663
percentile := float64(params.Percentile) / 100.0
670-
query := fmt.Sprintf(`
664+
query := `
671665
SELECT arrayAvg(flatten(groupArray(CPUArray))), MAX(MaxCPU),
672-
AVG(MaxMemory), MAX(MaxMemory), quantile(%f)(MaxMemory), count() FROM
666+
AVG(MaxMemory), MAX(MaxMemory), quantile(?)(MaxMemory), count() FROM
673667
(SELECT
674668
MAX(MemoryAverageUsedPercent) AS MaxMemory,
675669
MAX(CPUAverageUsedPercent) as MaxCPU,
676670
groupArray(CPUAverageUsedPercent) as CPUArray
677-
FROM %s
678-
WHERE ServiceId = %d AND (Timestamp BETWEEN '%s' AND '%s') %s
679-
GROUP BY HostName)`, percentile, config.ClickHouseMetricsTable, params.ServiceId,
671+
FROM ?
672+
WHERE ServiceId = ? AND (Timestamp BETWEEN '?' AND '?') ?
673+
GROUP BY HostName)`
674+
rows, err := c.client.Query(query, percentile, config.ClickHouseMetricsTable, params.ServiceId,
680675
common.FormatTime(params.StartDateTime), common.FormatTime(params.EndDateTime), conditions)
681-
rows, err := c.client.Query(query)
682676
if err == nil {
683677
defer func(rows *sql.Rows) {
684678
err := rows.Close()
@@ -722,31 +716,31 @@ func (c *ClickHouseClient) FetchMetricsServicesListSummary(ctx context.Context,
722716
formattedServicesList := joinIntSlice(params.ServicesList, ",")
723717
percentile := float64(params.Percentile) / 100.0
724718

725-
query := fmt.Sprintf(`
719+
query := `
726720
WITH LatestServices AS (
727721
SELECT
728722
ServiceId as s_id, max(Timestamp) as last_seen
729-
FROM %s
730-
WHERE ServiceId in (%s) AND (Timestamp BETWEEN '%s' AND '%s')
723+
FROM ?
724+
WHERE ServiceId in (?) AND (Timestamp BETWEEN '?' AND '?')
731725
GROUP BY ServiceId
732726
), GroupedMetrics AS (
733727
SELECT
734728
ServiceId,
735729
max(MemoryAverageUsedPercent) AS MaxMemory,
736730
max(CPUAverageUsedPercent) as MaxCPU,
737731
groupArray(CPUAverageUsedPercent) as CPUArray
738-
FROM %s
732+
FROM ?
739733
GLOBAL JOIN LatestServices ON ServiceId = s_id
740-
WHERE ServiceId in (%s) AND (Timestamp BETWEEN last_seen - toIntervalHour(24) AND last_seen)
734+
WHERE ServiceId in (?) AND (Timestamp BETWEEN last_seen - toIntervalHour(24) AND last_seen)
741735
GROUP BY HostName, ServiceId
742736
)
743737
SELECT arrayAvg(flatten(groupArray(CPUArray))), max(MaxCPU), ServiceId,
744-
avg(MaxMemory), max(MaxMemory), quantile(%f)(MaxMemory), count()
738+
avg(MaxMemory), max(MaxMemory), quantile(?)(MaxMemory), count()
745739
FROM GroupedMetrics
746-
GROUP BY ServiceId`, config.ClickHouseMetricsTable, formattedServicesList,
740+
GROUP BY ServiceId`
741+
rows, err := c.client.Query(query, config.ClickHouseMetricsTable, formattedServicesList,
747742
common.FormatTime(params.StartDateTime), common.FormatTime(params.EndDateTime),
748743
config.ClickHouseMetricsTable, formattedServicesList, percentile)
749-
rows, err := c.client.Query(query)
750744

751745
var results []common.MetricsServicesListSummary
752746

@@ -806,21 +800,21 @@ func (c *ClickHouseClient) FetchMetricsGraph(ctx context.Context, params common.
806800
if params.GroupBy != "none" {
807801
groupBy = fmt.Sprintf(", %s", params.GroupBy)
808802
}
809-
query := fmt.Sprintf(`
810-
SELECT Datetime %s, arrayAvg(flatten(groupArray(CPUArray))), MAX(MaxCPU),
811-
AVG(MaxMemory), MAX(MaxMemory), quantile(%f)(MaxMemory) FROM
812-
(SELECT toStartOfInterval(Timestamp, INTERVAL '%s') as
813-
Datetime %s,
803+
query := `
804+
SELECT Datetime ?, arrayAvg(flatten(groupArray(CPUArray))), MAX(MaxCPU),
805+
AVG(MaxMemory), MAX(MaxMemory), quantile(?)(MaxMemory) FROM
806+
(SELECT toStartOfInterval(Timestamp, INTERVAL '?') as
807+
Datetime ?,
814808
HostName,
815809
MAX(MemoryAverageUsedPercent) AS MaxMemory,
816810
MAX(CPUAverageUsedPercent) as MaxCPU,
817811
groupArray(CPUAverageUsedPercent) as CPUArray
818-
FROM %s
819-
WHERE ServiceId = %d AND (Datetime BETWEEN '%s' AND '%s') %s
820-
GROUP BY Datetime %s, HostName) GROUP BY Datetime %s ORDER BY Datetime DESC;
821-
`, groupBy, percentile, interval, groupBy, config.ClickHouseMetricsTable, params.ServiceId,
812+
FROM ?
813+
WHERE ServiceId = ? AND (Datetime BETWEEN '?' AND '?') ?
814+
GROUP BY Datetime ?, HostName) GROUP BY Datetime ? ORDER BY Datetime DESC;
815+
`
816+
rows, err := c.client.Query(query, groupBy, percentile, interval, groupBy, config.ClickHouseMetricsTable, params.ServiceId,
822817
common.FormatTime(params.StartDateTime), common.FormatTime(params.EndDateTime), conditions, groupBy, groupBy)
823-
rows, err := c.client.Query(query)
824818
if err == nil {
825819
defer func(rows *sql.Rows) {
826820
err := rows.Close()
@@ -869,7 +863,7 @@ func (c *ClickHouseClient) FetchMetricsCpuTrend(ctx context.Context, params comm
869863
finalResult := common.MetricsCpuTrend{}
870864
_, conditions := BuildConditions(defaultEmptyList, params.HostName, params.InstanceType, defaultEmptyList, filterQuery)
871865

872-
query := fmt.Sprintf(`
866+
query := `
873867
WITH CURRENT_CONSUMPTION AS (
874868
SELECT
875869
arrayAvg(flatten(groupArray(CPUArray))) AS avg_cpu,
@@ -882,8 +876,8 @@ func (c *ClickHouseClient) FetchMetricsCpuTrend(ctx context.Context, params comm
882876
MAX(MemoryAverageUsedPercent) AS MaxMemory,
883877
MAX(CPUAverageUsedPercent) as MaxCPU,
884878
groupArray(CPUAverageUsedPercent) as CPUArray
885-
FROM %s
886-
WHERE ServiceId = %d AND (Timestamp BETWEEN '%s' AND '%s') %s
879+
FROM ?
880+
WHERE ServiceId = ? AND (Timestamp BETWEEN '?' AND '?') ?
887881
GROUP BY HostName)
888882
),
889883
PREVIOUS_CONSUMPTION AS (
@@ -898,22 +892,22 @@ func (c *ClickHouseClient) FetchMetricsCpuTrend(ctx context.Context, params comm
898892
MAX(MemoryAverageUsedPercent) AS MaxMemory,
899893
MAX(CPUAverageUsedPercent) as MaxCPU,
900894
groupArray(CPUAverageUsedPercent) as CPUArray
901-
FROM %s
902-
WHERE ServiceId = %d AND (Timestamp BETWEEN '%s' AND '%s') %s
895+
FROM ?
896+
WHERE ServiceId = ? AND (Timestamp BETWEEN '?' AND '?') ?
903897
GROUP BY HostName)
904898
)
905899
SELECT avg_cpu, max_cpu, avg_memory, max_memory
906900
FROM (
907901
SELECT * FROM CURRENT_CONSUMPTION
908902
UNION ALL
909903
SELECT * FROM PREVIOUS_CONSUMPTION)
910-
order by SortOrder`, config.ClickHouseMetricsTable, params.ServiceId,
904+
order by SortOrder`
905+
906+
first := true
907+
rows, err := c.client.Query(query, config.ClickHouseMetricsTable, params.ServiceId,
911908
common.FormatTime(params.StartDateTime), common.FormatTime(params.EndDateTime), conditions,
912909
config.ClickHouseMetricsTable, params.ServiceId,
913910
common.FormatTime(params.ComparedStartDateTime), common.FormatTime(params.ComparedEndDateTime), conditions)
914-
915-
first := true
916-
rows, err := c.client.Query(query)
917911
if err == nil {
918912
defer func(rows *sql.Rows) {
919913
err := rows.Close()
@@ -966,10 +960,10 @@ func (c *ClickHouseClient) FetchServices(ctx context.Context, params common.Serv
966960
expr = "(ServiceId,ContainerEnvName)"
967961
groupByExpr = "GROUP BY (ServiceId,ContainerEnvName)"
968962
}
969-
query := fmt.Sprintf(`
970-
SELECT %s from flamedb.samples_1min WHERE (Timestamp BETWEEN '%s' AND '%s') %s;
971-
`, expr, common.FormatTime(params.StartDateTime), common.FormatTime(params.EndDateTime), groupByExpr)
972-
rows, err := c.client.Query(query)
963+
query := `
964+
SELECT ? from flamedb.samples_1min WHERE (Timestamp BETWEEN '?' AND '?') ?;
965+
`
966+
rows, err := c.client.Query(query, expr, common.FormatTime(params.StartDateTime), common.FormatTime(params.EndDateTime), groupByExpr)
973967
result := make([]SrvResp, 0)
974968
if err == nil {
975969
defer rows.Close()
@@ -999,12 +993,12 @@ func (c *ClickHouseClient) FetchSessionsCount(ctx context.Context, params common
999993
filterQuery string) (int, error) {
1000994
_, conditions := BuildConditions(params.ContainerName, params.HostName, params.InstanceType, params.K8SObject, filterQuery)
1001995

1002-
query := fmt.Sprintf(`
1003-
SELECT uniq(HostName,Timestamp) FROM flamedb.samples_1min WHERE ServiceId = %d AND
1004-
(Timestamp BETWEEN '%s' AND '%s') %s;
1005-
`, params.ServiceId, common.FormatTime(params.StartDateTime),
996+
query := `
997+
SELECT uniq(HostName,Timestamp) FROM flamedb.samples_1min WHERE ServiceId = ? AND
998+
(Timestamp BETWEEN '?' AND '?') ?;
999+
`
1000+
rows, err := c.client.Query(query, params.ServiceId, common.FormatTime(params.StartDateTime),
10061001
common.FormatTime(params.EndDateTime), conditions)
1007-
rows, err := c.client.Query(query)
10081002
if err == nil {
10091003
defer rows.Close()
10101004
for rows.Next() {
@@ -1025,11 +1019,11 @@ func (c *ClickHouseClient) FetchSessionsCount(ctx context.Context, params common
10251019
func (c *ClickHouseClient) FetchLastHTML(ctx context.Context, params common.MetricsLastHTMLParams,
10261020
filterQuery string) (string, error) {
10271021
_, conditions := BuildConditions(params.ContainerName, params.HostName, params.InstanceType, params.K8SObject, filterQuery)
1028-
query := fmt.Sprintf(`
1029-
SELECT argMax(HTMLPath,Timestamp) FROM flamedb.metrics WHERE ServiceId = %d AND
1030-
(Timestamp BETWEEN '%s' AND '%s') %s;
1031-
`, params.ServiceId, common.FormatTime(params.StartDateTime), common.FormatTime(params.EndDateTime), conditions)
1032-
rows, err := c.client.Query(query)
1022+
query := `
1023+
SELECT argMax(HTMLPath,Timestamp) FROM flamedb.metrics WHERE ServiceId = ? AND
1024+
(Timestamp BETWEEN '?' AND '?') ?;
1025+
`
1026+
rows, err := c.client.Query(query, params.ServiceId, common.FormatTime(params.StartDateTime), common.FormatTime(params.EndDateTime), conditions)
10331027
if err == nil {
10341028
defer rows.Close()
10351029
for rows.Next() {

0 commit comments

Comments
 (0)