Skip to content

Commit 2adaf43

Browse files
committed
feat: sequence: handle synth
1 parent 1f25d86 commit 2adaf43

File tree

1 file changed

+39
-35
lines changed

1 file changed

+39
-35
lines changed

pkg/render/sequence.go

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ type SequenceConfig struct {
4242

4343
// Sequence returns a sequence diagram rendered as an SVG image.
4444
func Sequence(ts vsl.TransactionSet, root *vsl.Transaction, cfg SequenceConfig) string {
45+
// Reject sessions
46+
if root.TXType == vsl.TxTypeSession {
47+
return "ERROR: sequence does not support sessions"
48+
}
49+
4550
s := svgsequence.NewSequence()
4651
if cfg.Distance != 0 {
4752
s.SetDistance(cfg.Distance)
@@ -74,22 +79,15 @@ func addTransactionLogs(s *svgsequence.Sequence, ts vsl.TransactionSet, tx *vsl.
7479
var err error
7580
var reqReceived, reqProcessed *HTTPRequest
7681

77-
// The diagram is better understood without sessions, keeping it working
78-
// with them just in case
79-
if tx.TXType == vsl.TxTypeSession {
82+
reqReceived, err = NewHTTPRequest(tx, true, nil)
83+
if err != nil {
84+
slog.Warn("failed to create HTTPRequest", "tx", tx.TXID)
8085
reqReceived = &HTTPRequest{}
86+
}
87+
reqProcessed, err = NewHTTPRequest(tx, false, nil)
88+
if err != nil {
89+
slog.Warn("failed to create HTTPRequest", "tx", tx.TXID)
8190
reqProcessed = &HTTPRequest{}
82-
} else {
83-
reqReceived, err = NewHTTPRequest(tx, true, nil)
84-
if err != nil {
85-
slog.Warn("failed to create HTTPRequest", "tx", tx.TXID)
86-
reqReceived = &HTTPRequest{}
87-
}
88-
reqProcessed, err = NewHTTPRequest(tx, false, nil)
89-
if err != nil {
90-
slog.Warn("failed to create HTTPRequest", "tx", tx.TXID)
91-
reqProcessed = &HTTPRequest{}
92-
}
9391
}
9492

9593
// When processing ESI, if we add the response status step at the exact moment
@@ -100,8 +98,17 @@ func addTransactionLogs(s *svgsequence.Sequence, ts vsl.TransactionSet, tx *vsl.
10098
for _, r := range tx.Records {
10199
switch record := r.(type) {
102100
case vsl.BeginRecord:
103-
if tx.TXType != vsl.TxTypeSession {
104-
s.OpenSection(string(tx.TXID), getTxTypeColor(tx.TXType))
101+
s.OpenSection(string(tx.TXID), getTxTypeColor(tx.TXType))
102+
103+
case vsl.ReqStartRecord:
104+
if tx.ESILevel > 0 {
105+
start := fmt.Sprintf("%s\nESI Level %d", requestSequence(reqReceived), tx.ESILevel)
106+
s.AddStep(svgsequence.Step{SourceActor: V, TargetActor: V, Description: start})
107+
s.AddStep(svgsequence.Step{SourceActor: V, TargetActor: H, Description: requestSequence(reqProcessed)})
108+
} else {
109+
start := fmt.Sprintf("%s\n%s %s", requestSequence(reqReceived), record.ClientIP, record.Listener)
110+
s.AddStep(svgsequence.Step{SourceActor: C, TargetActor: V, Description: start})
111+
s.AddStep(svgsequence.Step{SourceActor: V, TargetActor: H, Description: requestSequence(reqProcessed)})
105112
}
106113

107114
case vsl.EndRecord:
@@ -132,17 +139,6 @@ func addTransactionLogs(s *svgsequence.Sequence, ts vsl.TransactionSet, tx *vsl.
132139
Color: ColorGray,
133140
})
134141

135-
case vsl.ReqStartRecord:
136-
if tx.ESILevel > 0 {
137-
start := fmt.Sprintf("%s\nESI Level %d", requestSequence(reqReceived), tx.ESILevel)
138-
s.AddStep(svgsequence.Step{SourceActor: V, TargetActor: V, Description: start})
139-
s.AddStep(svgsequence.Step{SourceActor: V, TargetActor: H, Description: requestSequence(reqProcessed)})
140-
} else {
141-
start := fmt.Sprintf("%s\n%s %s", requestSequence(reqReceived), record.ClientIP, record.Listener)
142-
s.AddStep(svgsequence.Step{SourceActor: C, TargetActor: V, Description: start})
143-
s.AddStep(svgsequence.Step{SourceActor: V, TargetActor: H, Description: requestSequence(reqProcessed)})
144-
}
145-
146142
case vsl.VCLCallRecord:
147143
if cfg.IncludeCalls {
148144
s.AddStep(svgsequence.Step{SourceActor: V, TargetActor: V, Description: "call " + record.GetRawValue(), Color: ColorCall})
@@ -152,6 +148,17 @@ func addTransactionLogs(s *svgsequence.Sequence, ts vsl.TransactionSet, tx *vsl.
152148
case "HIT", "MISS", "PASS":
153149
s.AddStep(svgsequence.Step{SourceActor: H, TargetActor: V, Description: r.GetRawValue()})
154150

151+
case "SYNTH":
152+
if respStep != nil {
153+
s.AddStep(svgsequence.Step{SourceActor: V, TargetActor: V, Description: "SYNTH\n" + respStep.Description})
154+
respStep = nil
155+
} else {
156+
s.AddStep(svgsequence.Step{SourceActor: V, TargetActor: V, Description: r.GetRawValue()})
157+
}
158+
159+
case "PIPE":
160+
s.AddStep(svgsequence.Step{SourceActor: V, TargetActor: C, Description: r.GetRawValue()})
161+
155162
case "BACKEND_FETCH":
156163
s.AddStep(svgsequence.Step{SourceActor: V, TargetActor: B, Description: requestSequence(reqProcessed)})
157164

@@ -174,11 +181,6 @@ func addTransactionLogs(s *svgsequence.Sequence, ts vsl.TransactionSet, tx *vsl.
174181
s.AddStep(svgsequence.Step{SourceActor: V, TargetActor: V, Description: "return " + record.GetRawValue(), Color: ColorReturn})
175182
}
176183

177-
switch r.GetRawValue() {
178-
case "synth":
179-
s.AddStep(svgsequence.Step{SourceActor: H, TargetActor: V, Description: r.GetRawValue()})
180-
}
181-
182184
case vsl.StatusRecord:
183185
switch record.GetTag() {
184186
case tags.BerespStatus:
@@ -187,6 +189,10 @@ func addTransactionLogs(s *svgsequence.Sequence, ts vsl.TransactionSet, tx *vsl.
187189

188190
case tags.RespStatus:
189191
s1 := statusSequence(tx, record.Status, tags.RespReason)
192+
if respStep != nil {
193+
// Probably a synth response
194+
s.AddStep(svgsequence.Step{SourceActor: V, TargetActor: V, Description: respStep.Description})
195+
}
190196
if tx.ESILevel == 0 {
191197
respStep = &svgsequence.Step{SourceActor: V, TargetActor: C, Description: s1}
192198
} else {
@@ -214,9 +220,7 @@ func addTransactionLogs(s *svgsequence.Sequence, ts vsl.TransactionSet, tx *vsl.
214220
if childTx != nil {
215221
s.CloseSection()
216222
addTransactionLogs(s, ts, childTx, cfg, visited)
217-
if tx.TXType != vsl.TxTypeSession {
218-
s.OpenSection(string(tx.TXID), getTxTypeColor(tx.TXType))
219-
}
223+
s.OpenSection(string(tx.TXID), getTxTypeColor(tx.TXType))
220224
} else {
221225
actor := V
222226
if record.TXType == vsl.LinkTypeBereq {

0 commit comments

Comments
 (0)