refactor(jpush): add structured logging to JPush client methods
All checks were successful
Build Backend / build (push) Successful in 2m6s
Build Backend / build-docker (push) Successful in 1m23s

Add zap logger calls to Track, PushByRegistrationIDs, PushByAliases, PushAll,
and GetDeviceInfo methods for improved observability. Logs include request
debug info, response parsing status, success confirmations, and error
tracking with relevant context like message IDs, counts, and registration IDs.
This commit is contained in:
lafay
2026-04-28 00:08:37 +08:00
parent 8b1e411c89
commit 56c61f1895

View File

@@ -193,10 +193,24 @@ func (c *Client) Push(payload map[string]any) (*PushResponse, *RateLimitInfo, er
resp, respBody, rateLimit, err := c.doRequest("POST", PushAPIBaseURL+"/push", payload)
if err != nil {
c.logger.Error("jpush push request failed",
zap.Error(err),
)
return nil, rateLimit, err
}
result, parseErr := c.parseResponse(resp, respBody)
if parseErr != nil {
c.logger.Error("jpush push response parse failed",
zap.Int("status", resp.StatusCode),
zap.Error(parseErr),
)
} else {
c.logger.Debug("jpush push response",
zap.String("msg_id", result.MsgID),
zap.Int64("send_no", result.SendNo),
)
}
return result, rateLimit, parseErr
}
@@ -208,6 +222,12 @@ func (c *Client) PushByRegistrationIDs(registrationIDs []string, notification *N
return nil, fmt.Errorf("registration IDs exceed 1000 limit")
}
c.logger.Debug("jpush push by registration_ids",
zap.Int("count", len(registrationIDs)),
zap.String("title", notification.Android.Title),
zap.String("alert", notification.Alert),
)
mergeExtras(notification, extras)
payload := map[string]any{
@@ -221,7 +241,19 @@ func (c *Client) PushByRegistrationIDs(registrationIDs []string, notification *N
}
result, _, err := c.Push(payload)
return result, err
if err != nil {
c.logger.Error("jpush push by registration_ids failed",
zap.Int("count", len(registrationIDs)),
zap.Error(err),
)
return nil, err
}
c.logger.Info("jpush push by registration_ids success",
zap.Int("count", len(registrationIDs)),
zap.String("msg_id", result.MsgID),
)
return result, nil
}
func (c *Client) PushByAliases(aliases []string, notification *Notification, extras map[string]any) (*PushResponse, error) {
@@ -232,6 +264,12 @@ func (c *Client) PushByAliases(aliases []string, notification *Notification, ext
return nil, fmt.Errorf("aliases exceed 1000 limit")
}
c.logger.Debug("jpush push by aliases",
zap.Int("count", len(aliases)),
zap.String("title", notification.Android.Title),
zap.String("alert", notification.Alert),
)
mergeExtras(notification, extras)
payload := map[string]any{
@@ -245,10 +283,27 @@ func (c *Client) PushByAliases(aliases []string, notification *Notification, ext
}
result, _, err := c.Push(payload)
if err != nil {
c.logger.Error("jpush push by aliases failed",
zap.Int("count", len(aliases)),
zap.Error(err),
)
return nil, err
}
c.logger.Info("jpush push by aliases success",
zap.Int("count", len(aliases)),
zap.String("msg_id", result.MsgID),
)
return result, err
}
func (c *Client) PushAll(notification *Notification) (*PushResponse, error) {
c.logger.Info("jpush push all",
zap.String("title", notification.Android.Title),
zap.String("alert", notification.Alert),
)
payload := map[string]any{
"platform": "all",
"audience": "all",
@@ -260,6 +315,16 @@ func (c *Client) PushAll(notification *Notification) (*PushResponse, error) {
}
result, _, err := c.Push(payload)
if err != nil {
c.logger.Error("jpush push all failed",
zap.Error(err),
)
return nil, err
}
c.logger.Info("jpush push all success",
zap.String("msg_id", result.MsgID),
)
return result, err
}
@@ -325,6 +390,10 @@ type DeviceInfo struct {
}
func (c *Client) GetDeviceInfo(registrationID string) (*DeviceInfo, error) {
c.logger.Debug("jpush get device info",
zap.String("registration_id", registrationID),
)
path := DeviceAPIBaseURL + "/v3/devices/" + url.PathEscape(registrationID)
resp, body, _, err := c.doRequest("GET", path, nil)
if err != nil {
@@ -332,6 +401,10 @@ func (c *Client) GetDeviceInfo(registrationID string) (*DeviceInfo, error) {
}
if resp.StatusCode != http.StatusOK {
c.logger.Error("jpush get device info failed",
zap.String("registration_id", registrationID),
zap.Int("status", resp.StatusCode),
)
return nil, fmt.Errorf("jpush get device info failed: HTTP %d", resp.StatusCode)
}
@@ -339,10 +412,21 @@ func (c *Client) GetDeviceInfo(registrationID string) (*DeviceInfo, error) {
if err := json.Unmarshal(body, &info); err != nil {
return nil, fmt.Errorf("unmarshal device info: %w", err)
}
c.logger.Debug("jpush get device info success",
zap.String("registration_id", registrationID),
zap.String("alias", info.Alias),
zap.Strings("tags", info.Tags),
)
return &info, nil
}
func (c *Client) SetDeviceAlias(registrationID string, alias string) error {
c.logger.Info("jpush set device alias",
zap.String("registration_id", registrationID),
zap.String("alias", alias),
)
path := DeviceAPIBaseURL + "/v3/devices/" + url.PathEscape(registrationID)
payload := map[string]any{
"alias": alias,
@@ -354,12 +438,29 @@ func (c *Client) SetDeviceAlias(registrationID string, alias string) error {
}
if resp.StatusCode != http.StatusOK {
c.logger.Error("jpush set device alias failed",
zap.String("registration_id", registrationID),
zap.String("alias", alias),
zap.Int("status", resp.StatusCode),
zap.String("response", string(body)),
)
return fmt.Errorf("jpush set device alias failed: HTTP %d: %s", resp.StatusCode, string(body))
}
c.logger.Debug("jpush set device alias success",
zap.String("registration_id", registrationID),
zap.String("alias", alias),
)
return nil
}
func (c *Client) SetDeviceTags(registrationID string, addTags, removeTags []string) error {
c.logger.Info("jpush set device tags",
zap.String("registration_id", registrationID),
zap.Strings("add_tags", addTags),
zap.Strings("remove_tags", removeTags),
)
path := DeviceAPIBaseURL + "/v3/devices/" + url.PathEscape(registrationID)
tags := map[string]any{}
if len(addTags) > 0 {
@@ -379,12 +480,25 @@ func (c *Client) SetDeviceTags(registrationID string, addTags, removeTags []stri
}
if resp.StatusCode != http.StatusOK {
c.logger.Error("jpush set device tags failed",
zap.String("registration_id", registrationID),
zap.Int("status", resp.StatusCode),
zap.String("response", string(body)),
)
return fmt.Errorf("jpush set device tags failed: HTTP %d: %s", resp.StatusCode, string(body))
}
c.logger.Debug("jpush set device tags success",
zap.String("registration_id", registrationID),
)
return nil
}
func (c *Client) GetAliasRegistrationIDs(alias string) ([]string, error) {
c.logger.Debug("jpush get alias",
zap.String("alias", alias),
)
path := DeviceAPIBaseURL + "/v3/aliases/" + url.PathEscape(alias)
resp, body, _, err := c.doRequest("GET", path, nil)
if err != nil {
@@ -392,6 +506,10 @@ func (c *Client) GetAliasRegistrationIDs(alias string) ([]string, error) {
}
if resp.StatusCode != http.StatusOK {
c.logger.Error("jpush get alias failed",
zap.String("alias", alias),
zap.Int("status", resp.StatusCode),
)
return nil, fmt.Errorf("jpush get alias failed: HTTP %d", resp.StatusCode)
}
@@ -401,10 +519,19 @@ func (c *Client) GetAliasRegistrationIDs(alias string) ([]string, error) {
if err := json.Unmarshal(body, &result); err != nil {
return nil, fmt.Errorf("unmarshal alias response: %w", err)
}
c.logger.Debug("jpush get alias success",
zap.String("alias", alias),
zap.Int("count", len(result.RegistrationIDs)),
)
return result.RegistrationIDs, nil
}
func (c *Client) DeleteAlias(alias string) error {
c.logger.Info("jpush delete alias",
zap.String("alias", alias),
)
path := DeviceAPIBaseURL + "/v3/aliases/" + url.PathEscape(alias)
resp, body, _, err := c.doRequest("DELETE", path, nil)
if err != nil {
@@ -412,12 +539,26 @@ func (c *Client) DeleteAlias(alias string) error {
}
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusNoContent {
c.logger.Error("jpush delete alias failed",
zap.String("alias", alias),
zap.Int("status", resp.StatusCode),
zap.String("response", string(body)),
)
return fmt.Errorf("jpush delete alias failed: HTTP %d: %s", resp.StatusCode, string(body))
}
c.logger.Debug("jpush delete alias success",
zap.String("alias", alias),
)
return nil
}
func (c *Client) RemoveAliasDevices(alias string, registrationIDs []string) error {
c.logger.Info("jpush remove alias devices",
zap.String("alias", alias),
zap.Int("count", len(registrationIDs)),
)
path := DeviceAPIBaseURL + "/v3/aliases/" + url.PathEscape(alias)
payload := map[string]any{
"registration_ids": map[string]any{
@@ -431,7 +572,16 @@ func (c *Client) RemoveAliasDevices(alias string, registrationIDs []string) erro
}
if resp.StatusCode != http.StatusOK {
c.logger.Error("jpush remove alias devices failed",
zap.String("alias", alias),
zap.Int("status", resp.StatusCode),
zap.String("response", string(body)),
)
return fmt.Errorf("jpush remove alias devices failed: HTTP %d: %s", resp.StatusCode, string(body))
}
c.logger.Debug("jpush remove alias devices success",
zap.String("alias", alias),
)
return nil
}