refactor static analysis code for stability framework

Change-Id: I4049f16063264603fb61cbeb0cdb4010267fc19c
This commit is contained in:
Han Kang 2022-11-02 13:22:32 -07:00
parent 91dbd82cde
commit 78704ae47d
3 changed files with 95 additions and 124 deletions

View File

@ -17,7 +17,6 @@ limitations under the License.
package main package main
import ( import (
"errors"
"fmt" "fmt"
"go/ast" "go/ast"
"go/token" "go/token"
@ -165,23 +164,15 @@ func (c *metricDecoder) decodeDesc(ce *ast.CallExpr) (metric, error) {
func (c *metricDecoder) decodeString(expr ast.Expr) (*string, error) { func (c *metricDecoder) decodeString(expr ast.Expr) (*string, error) {
switch e := expr.(type) { switch e := expr.(type) {
case *ast.BasicLit: case *ast.BasicLit:
s, err := stringValue(e) value, err := stringValue(e)
return &s, err if err != nil {
case *ast.Ident: return nil, err
variableExpr, found := c.variables[e.Name]
if !found {
return nil, fmt.Errorf("can't decode string")
} }
bl, ok := variableExpr.(*ast.BasicLit) return &value, nil
if !ok {
return nil, fmt.Errorf("can't decode string")
}
v, err := stringValue(bl)
return &v, err
case *ast.CallExpr: case *ast.CallExpr:
firstArg, secondArg, thirdArg, err := c.decodeBuildFQNameArguments(e) firstArg, secondArg, thirdArg, err := c.decodeBuildFQNameArguments(e)
if err != nil { if err != nil {
return nil, err return nil, newDecodeErrorf(expr, errNonStringAttribute)
} }
se, ok := e.Fun.(*ast.SelectorExpr) se, ok := e.Fun.(*ast.SelectorExpr)
if ok { if ok {
@ -192,22 +183,70 @@ func (c *metricDecoder) decodeString(expr ast.Expr) (*string, error) {
return &n, nil return &n, nil
} }
} }
case *ast.SelectorExpr: case *ast.Ident:
s, ok := e.X.(*ast.Ident) variableExpr, found := c.variables[e.Name]
if !ok {
return nil, newDecodeErrorf(e, errExprNotIdent, e.X)
}
variableExpr, found := c.variables[strings.Join([]string{s.Name, e.Sel.Name}, ".")]
if !found { if !found {
return nil, newDecodeErrorf(e, errBadImportedVariableAttribute) return nil, newDecodeErrorf(expr, errBadVariableAttribute)
} }
bl, ok := variableExpr.(*ast.BasicLit) bl, ok := variableExpr.(*ast.BasicLit)
if !ok { if !ok {
return nil, newDecodeErrorf(e, errNonStringAttribute) return nil, newDecodeErrorf(expr, errNonStringAttribute)
} }
value, err := stringValue(bl) value, err := stringValue(bl)
if err != nil { if err != nil {
return nil, newDecodeErrorf(e, err.Error()) return nil, err
}
return &value, nil
case *ast.SelectorExpr:
s, ok := e.X.(*ast.Ident)
if !ok {
return nil, newDecodeErrorf(expr, errExprNotIdent, e.X)
}
variableExpr, found := c.variables[strings.Join([]string{s.Name, e.Sel.Name}, ".")]
if !found {
return nil, newDecodeErrorf(expr, errBadImportedVariableAttribute)
}
bl, ok := variableExpr.(*ast.BasicLit)
if !ok {
return nil, newDecodeErrorf(expr, errNonStringAttribute)
}
value, err := stringValue(bl)
if err != nil {
return nil, err
}
return &value, nil
case *ast.BinaryExpr:
var binaryExpr *ast.BinaryExpr
binaryExpr = e
var okay bool
var value string
okay = true
for okay {
yV, okay := binaryExpr.Y.(*ast.BasicLit)
if !okay {
return nil, newDecodeErrorf(expr, errNonStringAttribute)
}
yVal, err := stringValue(yV)
if err != nil {
return nil, newDecodeErrorf(expr, errNonStringAttribute)
}
value = fmt.Sprintf("%s%s", yVal, value)
x, okay := binaryExpr.X.(*ast.BinaryExpr)
if !okay {
// should be basicLit
xV, okay := binaryExpr.X.(*ast.BasicLit)
if !okay {
return nil, newDecodeErrorf(expr, errNonStringAttribute)
}
xVal, err := stringValue(xV)
if err != nil {
return nil, newDecodeErrorf(expr, errNonStringAttribute)
}
value = fmt.Sprintf("%s%s", xVal, value)
break
}
binaryExpr = x
} }
return &value, nil return &value, nil
} }
@ -297,36 +336,7 @@ func (c *metricDecoder) decodeLabels(expr ast.Expr) ([]string, error) {
cl = cl2 cl = cl2
} }
} }
labels := make([]string, len(cl.Elts)) return c.decodeLabelsFromArray(cl.Elts)
for i, el := range cl.Elts {
v, ok := el.(*ast.Ident)
if ok {
variableExpr, found := c.variables[v.Name]
if !found {
return nil, newDecodeErrorf(expr, errBadVariableAttribute)
}
bl, ok := variableExpr.(*ast.BasicLit)
if !ok {
return nil, newDecodeErrorf(expr, errNonStringAttribute)
}
value, err := stringValue(bl)
if err != nil {
return nil, err
}
labels[i] = value
continue
}
bl, ok := el.(*ast.BasicLit)
if !ok {
return nil, errors.New(errLabels)
}
value, err := stringValue(bl)
if err != nil {
return nil, err
}
labels[i] = value
}
return labels, nil
} }
func (c *metricDecoder) decodeOpts(expr ast.Expr) (metric, error) { func (c *metricDecoder) decodeOpts(expr ast.Expr) (metric, error) {
@ -353,77 +363,11 @@ func (c *metricDecoder) decodeOpts(expr ast.Expr) (metric, error) {
case "Namespace", "Subsystem", "Name", "Help", "DeprecatedVersion": case "Namespace", "Subsystem", "Name", "Help", "DeprecatedVersion":
var value string var value string
var err error var err error
switch v := kv.Value.(type) { s, err := c.decodeString(kv.Value)
case *ast.BasicLit:
value, err = stringValue(v)
if err != nil { if err != nil {
return m, err return m, newDecodeErrorf(expr, err.Error())
}
case *ast.Ident:
variableExpr, found := c.variables[v.Name]
if !found {
return m, newDecodeErrorf(expr, errBadVariableAttribute)
}
bl, ok := variableExpr.(*ast.BasicLit)
if !ok {
return m, newDecodeErrorf(expr, errNonStringAttribute)
}
value, err = stringValue(bl)
if err != nil {
return m, err
}
case *ast.SelectorExpr:
s, ok := v.X.(*ast.Ident)
if !ok {
return m, newDecodeErrorf(expr, errExprNotIdent, v.X)
}
variableExpr, found := c.variables[strings.Join([]string{s.Name, v.Sel.Name}, ".")]
if !found {
return m, newDecodeErrorf(expr, errBadImportedVariableAttribute)
}
bl, ok := variableExpr.(*ast.BasicLit)
if !ok {
return m, newDecodeErrorf(expr, errNonStringAttribute)
}
value, err = stringValue(bl)
if err != nil {
return m, err
}
case *ast.BinaryExpr:
var binaryExpr *ast.BinaryExpr
binaryExpr = v
var okay bool
okay = true
for okay {
yV, okay := binaryExpr.Y.(*ast.BasicLit)
if !okay {
return m, newDecodeErrorf(expr, errNonStringAttribute)
}
yVal, err := stringValue(yV)
if err != nil {
return m, newDecodeErrorf(expr, errNonStringAttribute)
}
value = fmt.Sprintf("%s%s", yVal, value)
x, okay := binaryExpr.X.(*ast.BinaryExpr)
if !okay {
// should be basicLit
xV, okay := binaryExpr.X.(*ast.BasicLit)
if !okay {
return m, newDecodeErrorf(expr, errNonStringAttribute)
}
xVal, err := stringValue(xV)
if err != nil {
return m, newDecodeErrorf(expr, errNonStringAttribute)
}
value = fmt.Sprintf("%s%s", xVal, value)
break
}
binaryExpr = x
}
default:
return m, newDecodeErrorf(expr, errNonStringAttribute)
} }
value = *s
switch key { switch key {
case "Namespace": case "Namespace":
m.Namespace = value m.Namespace = value

View File

@ -1363,6 +1363,11 @@
help: Cumulative proxy rules Endpoint changes help: Cumulative proxy rules Endpoint changes
type: Counter type: Counter
stabilityLevel: ALPHA stabilityLevel: ALPHA
- name: sync_proxy_rules_iptables_partial_restore_failures_total
subsystem: kubeproxy
help: Cumulative proxy iptables partial restore failures
type: Counter
stabilityLevel: ALPHA
- name: sync_proxy_rules_iptables_restore_failures_total - name: sync_proxy_rules_iptables_restore_failures_total
subsystem: kubeproxy subsystem: kubeproxy
help: Cumulative proxy iptables restore failures help: Cumulative proxy iptables restore failures
@ -2247,6 +2252,16 @@
- protocol - protocol
- stage - stage
- transport - transport
- name: dial_start_total
subsystem: egress_dialer
namespace: apiserver
help: Dial starts, labeled by the protocol (http-connect or grpc) and transport
(tcp or uds).
type: Counter
stabilityLevel: ALPHA
labels:
- protocol
- transport
- name: request_aborts_total - name: request_aborts_total
subsystem: apiserver subsystem: apiserver
help: Number of requests which apiserver aborted possibly due to a timeout, for help: Number of requests which apiserver aborted possibly due to a timeout, for

View File

@ -6,7 +6,7 @@ description: >-
--- ---
## Metrics (auto-generated 2022 Nov 01) ## Metrics (auto-generated 2022 Nov 02)
This page details the metrics that different Kubernetes components export. You can query the metrics endpoint for these This page details the metrics that different Kubernetes components export. You can query the metrics endpoint for these
components using an HTTP scrape, and fetch the current metrics data in Prometheus format. components using an HTTP scrape, and fetch the current metrics data in Prometheus format.
@ -344,6 +344,12 @@ components using an HTTP scrape, and fetch the current metrics data in Prometheu
<td class="metric_description">Dial failure count, labeled by the protocol (http-connect or grpc), transport (tcp or uds), and stage (connect or proxy). The stage indicates at which stage the dial failed</td> <td class="metric_description">Dial failure count, labeled by the protocol (http-connect or grpc), transport (tcp or uds), and stage (connect or proxy). The stage indicates at which stage the dial failed</td>
<td class="metric_labels_varying"><div class="metric_label">protocol</div><div class="metric_label">stage</div><div class="metric_label">transport</div></td> <td class="metric_labels_varying"><div class="metric_label">protocol</div><div class="metric_label">stage</div><div class="metric_label">transport</div></td>
<td class="metric_labels_constant">None</td></tr> <td class="metric_labels_constant">None</td></tr>
<tr class="metric"><td class="metric_name">apiserver_egress_dialer_dial_start_total</td>
<td class="metric_stability_level" data-stability="alpha">ALPHA</td>
<td class="metric_type" data-type="counter">Counter</td>
<td class="metric_description">Dial starts, labeled by the protocol (http-connect or grpc) and transport (tcp or uds).</td>
<td class="metric_labels_varying"><div class="metric_label">protocol</div><div class="metric_label">transport</div></td>
<td class="metric_labels_constant">None</td></tr>
<tr class="metric"><td class="metric_name">apiserver_envelope_encryption_dek_cache_fill_percent</td> <tr class="metric"><td class="metric_name">apiserver_envelope_encryption_dek_cache_fill_percent</td>
<td class="metric_stability_level" data-stability="alpha">ALPHA</td> <td class="metric_stability_level" data-stability="alpha">ALPHA</td>
<td class="metric_type" data-type="gauge">Gauge</td> <td class="metric_type" data-type="gauge">Gauge</td>
@ -1478,6 +1484,12 @@ components using an HTTP scrape, and fetch the current metrics data in Prometheu
<td class="metric_description">Cumulative proxy rules Endpoint changes</td> <td class="metric_description">Cumulative proxy rules Endpoint changes</td>
<td class="metric_labels_varying">None</td> <td class="metric_labels_varying">None</td>
<td class="metric_labels_constant">None</td></tr> <td class="metric_labels_constant">None</td></tr>
<tr class="metric"><td class="metric_name">kubeproxy_sync_proxy_rules_iptables_partial_restore_failures_total</td>
<td class="metric_stability_level" data-stability="alpha">ALPHA</td>
<td class="metric_type" data-type="counter">Counter</td>
<td class="metric_description">Cumulative proxy iptables partial restore failures</td>
<td class="metric_labels_varying">None</td>
<td class="metric_labels_constant">None</td></tr>
<tr class="metric"><td class="metric_name">kubeproxy_sync_proxy_rules_iptables_restore_failures_total</td> <tr class="metric"><td class="metric_name">kubeproxy_sync_proxy_rules_iptables_restore_failures_total</td>
<td class="metric_stability_level" data-stability="alpha">ALPHA</td> <td class="metric_stability_level" data-stability="alpha">ALPHA</td>
<td class="metric_type" data-type="counter">Counter</td> <td class="metric_type" data-type="counter">Counter</td>