traces.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package huawei
  15. import (
  16. "fmt"
  17. "net/url"
  18. "strconv"
  19. "time"
  20. "yunion.io/x/jsonutils"
  21. "yunion.io/x/pkg/errors"
  22. "yunion.io/x/cloudmux/pkg/cloudprovider"
  23. )
  24. type SUser struct {
  25. Domain map[string]string
  26. Name string
  27. Id string
  28. }
  29. type SEvent struct {
  30. TraceId string
  31. Code string
  32. TraceName string
  33. ResourceType string
  34. ApiVersion string
  35. SourceIp string
  36. TraceType string
  37. ServiceType string
  38. EventType string
  39. ProjectId string
  40. Request string
  41. Response string
  42. TrackerName string
  43. TraceStatus string
  44. Time int64
  45. ResourceId string
  46. ResourceName string
  47. User SUser
  48. RecordTime int64
  49. }
  50. func (event *SEvent) GetName() string {
  51. if len(event.ResourceName) > 0 {
  52. return event.ResourceName
  53. }
  54. if len(event.ResourceId) > 0 {
  55. return event.ResourceId
  56. }
  57. return event.TraceName
  58. }
  59. func (event *SEvent) GetService() string {
  60. return event.ServiceType
  61. }
  62. func (event *SEvent) GetAction() string {
  63. return event.TraceName
  64. }
  65. func (event *SEvent) GetResourceType() string {
  66. return event.ResourceType
  67. }
  68. func (event *SEvent) GetRequestId() string {
  69. return event.TraceId
  70. }
  71. func (event *SEvent) GetRequest() jsonutils.JSONObject {
  72. return jsonutils.Marshal(event)
  73. }
  74. func (event *SEvent) GetAccount() string {
  75. return event.User.Name
  76. }
  77. func (event *SEvent) IsSuccess() bool {
  78. code, _ := strconv.Atoi(event.Code)
  79. return code < 400
  80. }
  81. func (event *SEvent) GetCreatedAt() time.Time {
  82. return time.Unix(event.Time/1000, event.Time%1000)
  83. }
  84. func (self *SRegion) GetICloudEvents(start time.Time, end time.Time, withReadEvent bool) ([]cloudprovider.ICloudEvent, error) {
  85. if self.Id != HUAWEI_DEFAULT_REGION {
  86. return nil, cloudprovider.ErrNotSupported
  87. }
  88. events, err := self.GetEvents(start, end)
  89. if err != nil {
  90. return nil, err
  91. }
  92. iEvents := []cloudprovider.ICloudEvent{}
  93. for i := range events {
  94. iEvents = append(iEvents, &events[i])
  95. }
  96. return iEvents, nil
  97. }
  98. func (self *SRegion) GetEvents(start time.Time, end time.Time) ([]SEvent, error) {
  99. params := url.Values{}
  100. if start.IsZero() {
  101. start = time.Now().AddDate(0, 0, -7)
  102. }
  103. if end.IsZero() {
  104. end = time.Now()
  105. }
  106. params.Set("trace_type", "system")
  107. params.Set("from", fmt.Sprintf("%d000", start.Unix()))
  108. params.Set("to", fmt.Sprintf("%d000", end.Unix()))
  109. events := []SEvent{}
  110. for {
  111. resp, err := self.list(SERVICE_CTS, "traces", params)
  112. if err != nil {
  113. return nil, errors.Wrapf(err, "list events")
  114. }
  115. part := struct {
  116. Traces []SEvent
  117. MetaData struct {
  118. Marker string
  119. Count int
  120. }
  121. }{}
  122. err = resp.Unmarshal(&part)
  123. if err != nil {
  124. return nil, errors.Wrapf(err, "Unmarshal")
  125. }
  126. events = append(events, part.Traces...)
  127. if len(part.MetaData.Marker) == 0 || len(part.Traces) == 0 || len(events) >= part.MetaData.Count {
  128. break
  129. }
  130. params.Set("marker", part.MetaData.Marker)
  131. }
  132. return events, nil
  133. }