@@ -42,6 +42,11 @@ type SequenceConfig struct {
4242
4343// Sequence returns a sequence diagram rendered as an SVG image.
4444func 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\n ESI 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\n ESI 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