Skip to content

Commit 8d38a25

Browse files
committed
Merge 2.2 into develop
2 parents 72c0075 + 05449a7 commit 8d38a25

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1059
-448
lines changed

apiserver/common/networkingcommon/networkconfigapi.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func (api *NetworkConfigAPI) getMachineForSettingNetworkConfig(machineTag string
121121
}
122122

123123
if m.IsContainer() {
124-
logger.Warningf("not updating network config for container %q", m.Id())
124+
logger.Debugf("not updating network config for container %q", m.Id())
125125
}
126126

127127
return m, nil

apiserver/debuglog.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"net"
88
"net/http"
99
"net/url"
10+
"os"
1011
"strconv"
1112
"syscall"
1213
"time"
@@ -99,6 +100,9 @@ func (h *debugLogHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
99100
func isBrokenPipe(err error) bool {
100101
err = errors.Cause(err)
101102
if opErr, ok := err.(*net.OpError); ok {
103+
if sysCallErr, ok := opErr.Err.(*os.SyscallError); ok {
104+
return sysCallErr.Err == syscall.EPIPE
105+
}
102106
return opErr.Err == syscall.EPIPE
103107
}
104108
return false

apiserver/metricsender/metricsender.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,9 @@ func SendMetrics(st ModelBackend, sender MetricSender, clock clock.Clock, batchS
8888
lenM := len(metrics)
8989
if lenM == 0 {
9090
if sent == 0 {
91-
logger.Infof("nothing to send")
91+
logger.Debugf("nothing to send")
9292
} else {
93-
logger.Infof("done sending")
93+
logger.Debugf("done sending")
9494
}
9595
break
9696
}
@@ -151,7 +151,7 @@ func SendMetrics(st ModelBackend, sender MetricSender, clock clock.Clock, batchS
151151
if err != nil {
152152
return errors.Trace(err)
153153
}
154-
logger.Infof("metrics collection summary for %s: sent:%d unsent:%d held:%d (%d sent metrics stored)", st.ModelTag(), sent, unsent, held, sentStored)
154+
logger.Debugf("metrics collection summary for %s: sent:%d unsent:%d held:%d (%d sent metrics stored)", st.ModelTag(), sent, unsent, held, sentStored)
155155

156156
return nil
157157
}

apiserver/observer/request_notifier.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
type RequestObserver struct {
2020
clock clock.Clock
2121
logger loggo.Logger
22+
connLogger loggo.Logger
2223
apiConnectionCount func() int64
2324

2425
// state represents information that's built up as methods on this
@@ -30,6 +31,8 @@ type RequestObserver struct {
3031
id uint64
3132
websocketConnected time.Time
3233
tag string
34+
model string
35+
agent bool
3336
}
3437
}
3538

@@ -46,15 +49,34 @@ type RequestObserverContext struct {
4649

4750
// NewRequestObserver returns a new RPCObserver.
4851
func NewRequestObserver(ctx RequestObserverContext) *RequestObserver {
52+
// Ideally we should have a logging context so we can log into the correct
53+
// model rather than the api server for everything.
54+
module := ctx.Logger.Name()
4955
return &RequestObserver{
50-
clock: ctx.Clock,
51-
logger: ctx.Logger,
56+
clock: ctx.Clock,
57+
logger: ctx.Logger,
58+
connLogger: loggo.GetLogger(module + ".connection"),
59+
}
60+
}
61+
62+
func (n *RequestObserver) isAgent(entity names.Tag) bool {
63+
switch entity.(type) {
64+
case names.UnitTag, names.MachineTag:
65+
return true
66+
default:
67+
return false
5268
}
5369
}
5470

5571
// Login implements Observer.
56-
func (n *RequestObserver) Login(entity names.Tag, _ names.ModelTag, _ bool, _ string) {
72+
func (n *RequestObserver) Login(entity names.Tag, model names.ModelTag, fromController bool, _ string) {
5773
n.state.tag = entity.String()
74+
// Don't log connections from the controller to the model.
75+
if n.isAgent(entity) && !fromController {
76+
n.state.agent = true
77+
n.state.model = model.Id()
78+
n.connLogger.Infof("agent login: %s for %s", n.state.tag, n.state.model)
79+
}
5880
}
5981

6082
// Join implements Observer.
@@ -71,6 +93,9 @@ func (n *RequestObserver) Join(req *http.Request, connectionID uint64) {
7193

7294
// Leave implements Observer.
7395
func (n *RequestObserver) Leave() {
96+
if n.state.agent {
97+
n.connLogger.Infof("agent disconnected: %s for %s", n.state.tag, n.state.model)
98+
}
7499
n.logger.Debugf(
75100
"[%X] %s API connection terminated after %v",
76101
n.state.id,

cmd/jujud/agent/machine.go

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ import (
6565
jujunames "github.com/juju/juju/juju/names"
6666
"github.com/juju/juju/juju/paths"
6767
"github.com/juju/juju/mongo"
68-
"github.com/juju/juju/mongo/mgometrics"
69-
"github.com/juju/juju/mongo/txnmetrics"
68+
"github.com/juju/juju/mongo/mongometrics"
7069
"github.com/juju/juju/pubsub/centralhub"
7170
"github.com/juju/juju/service"
7271
"github.com/juju/juju/service/common"
@@ -323,7 +322,8 @@ func NewMachineAgent(
323322
loopDeviceManager: loopDeviceManager,
324323
newIntrospectionSocketName: newIntrospectionSocketName,
325324
prometheusRegistry: prometheusRegistry,
326-
txnmetricsCollector: txnmetrics.New(),
325+
mongoTxnCollector: mongometrics.NewTxnCollector(),
326+
mongoDialCollector: mongometrics.NewDialCollector(),
327327
preUpgradeSteps: preUpgradeSteps,
328328
statePool: &statePoolHolder{},
329329
}
@@ -339,18 +339,22 @@ func (a *MachineAgent) registerPrometheusCollectors() error {
339339
// Enable mgo stats collection only if requested,
340340
// as it may affect performance.
341341
mgo.SetStats(true)
342-
if err := a.prometheusRegistry.Register(mgometrics.New()); err != nil {
343-
return errors.Annotate(err, "registering mgo collector")
342+
collector := mongometrics.NewMgoStatsCollector(mgo.GetStats)
343+
if err := a.prometheusRegistry.Register(collector); err != nil {
344+
return errors.Annotate(err, "registering mgo stats collector")
344345
}
345346
}
346347
if err := a.prometheusRegistry.Register(
347348
logsendermetrics.BufferedLogWriterMetrics{a.bufferedLogger},
348349
); err != nil {
349350
return errors.Annotate(err, "registering logsender collector")
350351
}
351-
if err := a.prometheusRegistry.Register(a.txnmetricsCollector); err != nil {
352+
if err := a.prometheusRegistry.Register(a.mongoTxnCollector); err != nil {
352353
return errors.Annotate(err, "registering mgo/txn collector")
353354
}
355+
if err := a.prometheusRegistry.Register(a.mongoDialCollector); err != nil {
356+
return errors.Annotate(err, "registering mongo dial collector")
357+
}
354358
return nil
355359
}
356360

@@ -383,7 +387,8 @@ type MachineAgent struct {
383387
loopDeviceManager looputil.LoopDeviceManager
384388
newIntrospectionSocketName func(names.Tag) string
385389
prometheusRegistry *prometheus.Registry
386-
txnmetricsCollector *txnmetrics.Collector
390+
mongoTxnCollector *mongometrics.TxnCollector
391+
mongoDialCollector *mongometrics.DialCollector
387392
preUpgradeSteps upgrades.PreUpgradeStepsFunc
388393

389394
// Only API servers have hubs. This is temporary until the apiserver and
@@ -883,7 +888,11 @@ func (a *MachineAgent) openStateForUpgrade() (*state.State, error) {
883888
if !ok {
884889
return nil, errors.New("no state info available")
885890
}
886-
dialOpts, err := mongoDialOptions(mongo.DefaultDialOpts(), agentConfig)
891+
dialOpts, err := mongoDialOptions(
892+
mongo.DefaultDialOpts(),
893+
agentConfig,
894+
a.mongoDialCollector,
895+
)
887896
if err != nil {
888897
return nil, errors.Trace(err)
889898
}
@@ -904,7 +913,7 @@ func (a *MachineAgent) openStateForUpgrade() (*state.State, error) {
904913
// point in reading existing controller config from state in order
905914
// to pass in the max-txn-log-size value.
906915
InitDatabaseFunc: state.InitDatabase,
907-
RunTransactionObserver: a.txnmetricsCollector.AfterRunTransaction,
916+
RunTransactionObserver: a.mongoTxnCollector.AfterRunTransaction,
908917
})
909918
if err != nil {
910919
return nil, errors.Trace(err)
@@ -993,7 +1002,11 @@ func (a *MachineAgent) updateSupportedContainers(
9931002
return nil
9941003
}
9951004

996-
func mongoDialOptions(baseOpts mongo.DialOpts, agentConfig agent.Config) (mongo.DialOpts, error) {
1005+
func mongoDialOptions(
1006+
baseOpts mongo.DialOpts,
1007+
agentConfig agent.Config,
1008+
mongoDialCollector *mongometrics.DialCollector,
1009+
) (mongo.DialOpts, error) {
9971010
dialOpts := baseOpts
9981011
if limitStr := agentConfig.Value("MONGO_SOCKET_POOL_LIMIT"); limitStr != "" {
9991012
limit, err := strconv.Atoi(limitStr)
@@ -1004,6 +1017,10 @@ func mongoDialOptions(baseOpts mongo.DialOpts, agentConfig agent.Config) (mongo.
10041017
dialOpts.PoolLimit = limit
10051018
}
10061019
}
1020+
if dialOpts.PostDialServer != nil {
1021+
return mongo.DialOpts{}, errors.New("did not expect PostDialServer to be set")
1022+
}
1023+
dialOpts.PostDialServer = mongoDialCollector.PostDialServer
10071024
return dialOpts, nil
10081025
}
10091026

@@ -1013,14 +1030,18 @@ func (a *MachineAgent) initState(agentConfig agent.Config) (*state.State, error)
10131030
return nil, err
10141031
}
10151032

1016-
dialOpts, err := mongoDialOptions(stateWorkerDialOpts, agentConfig)
1033+
dialOpts, err := mongoDialOptions(
1034+
stateWorkerDialOpts,
1035+
agentConfig,
1036+
a.mongoDialCollector,
1037+
)
10171038
if err != nil {
10181039
return nil, errors.Trace(err)
10191040
}
10201041
st, _, err := openState(
10211042
agentConfig,
10221043
dialOpts,
1023-
a.txnmetricsCollector.AfterRunTransaction,
1044+
a.mongoTxnCollector.AfterRunTransaction,
10241045
)
10251046
if err != nil {
10261047
return nil, err
@@ -1112,7 +1133,11 @@ func (a *MachineAgent) startStateWorkers(
11121133
certChangedChan := make(chan params.StateServingInfo, 10)
11131134
// Each time apiserver worker is restarted, we need a fresh copy of state due
11141135
// to the fact that state holds lease managers which are killed and need to be reset.
1115-
dialOpts, err := mongoDialOptions(stateWorkerDialOpts, agentConfig)
1136+
dialOpts, err := mongoDialOptions(
1137+
stateWorkerDialOpts,
1138+
agentConfig,
1139+
a.mongoDialCollector,
1140+
)
11161141
if err != nil {
11171142
return nil, errors.Trace(err)
11181143
}
@@ -1121,7 +1146,7 @@ func (a *MachineAgent) startStateWorkers(
11211146
st, _, err := openState(
11221147
agentConfig,
11231148
dialOpts,
1124-
a.txnmetricsCollector.AfterRunTransaction,
1149+
a.mongoTxnCollector.AfterRunTransaction,
11251150
)
11261151
return st, err
11271152
}

environs/tools/tools.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,23 +98,23 @@ func FindTools(env environs.Environ, majorVersion, minorVersion int, stream stri
9898
return nil, errors.New("cannot find agent binaries without a complete cloud configuration")
9999
}
100100

101-
logger.Infof("finding agent binaries in stream %q", stream)
101+
logger.Debugf("finding agent binaries in stream %q", stream)
102102
if minorVersion >= 0 {
103-
logger.Infof("reading agent binaries with major.minor version %d.%d", majorVersion, minorVersion)
103+
logger.Debugf("reading agent binaries with major.minor version %d.%d", majorVersion, minorVersion)
104104
} else {
105-
logger.Infof("reading agent binaries with major version %d", majorVersion)
105+
logger.Debugf("reading agent binaries with major version %d", majorVersion)
106106
}
107107
defer convertToolsError(&err)
108108
// Construct a tools filter.
109109
// Discard all that are known to be irrelevant.
110110
if filter.Number != version.Zero {
111-
logger.Infof("filtering agent binaries by version: %s", filter.Number)
111+
logger.Debugf("filtering agent binaries by version: %s", filter.Number)
112112
}
113113
if filter.Series != "" {
114-
logger.Infof("filtering agent binaries by series: %s", filter.Series)
114+
logger.Debugf("filtering agent binaries by series: %s", filter.Series)
115115
}
116116
if filter.Arch != "" {
117-
logger.Infof("filtering agent binaries by architecture: %s", filter.Arch)
117+
logger.Debugf("filtering agent binaries by architecture: %s", filter.Arch)
118118
}
119119
sources, err := GetMetadataSources(env)
120120
if err != nil {
@@ -168,7 +168,7 @@ func FindToolsForCloud(sources []simplestreams.DataSource, cloudSpec simplestrea
168168

169169
// FindExactTools returns only the tools that match the supplied version.
170170
func FindExactTools(env environs.Environ, vers version.Number, series string, arch string) (_ *coretools.Tools, err error) {
171-
logger.Infof("finding exact version %s", vers)
171+
logger.Debugf("finding exact version %s", vers)
172172
// Construct a tools filter.
173173
// Discard all that are known to be irrelevant.
174174
filter := coretools.Filter{
@@ -177,7 +177,7 @@ func FindExactTools(env environs.Environ, vers version.Number, series string, ar
177177
Arch: arch,
178178
}
179179
stream := PreferredStream(&vers, env.Config().Development(), env.Config().AgentStream())
180-
logger.Infof("looking for tools in stream %q", stream)
180+
logger.Debugf("looking for tools in stream %q", stream)
181181
availableTools, err := FindTools(env, vers.Major, vers.Minor, stream, filter)
182182
if err != nil {
183183
return nil, err

environs/tools/tools_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,8 @@ func (s *SimpleStreamsToolsSuite) TestFindToolsFiltering(c *gc.C) {
209209
// messages. This still helps to ensure that all log messages are
210210
// properly formed.
211211
messages := []jc.SimpleMessage{
212-
{loggo.INFO, "reading agent binaries with major version 1"},
213-
{loggo.INFO, "filtering agent binaries by version: \\d+\\.\\d+\\.\\d+"},
212+
{loggo.DEBUG, "reading agent binaries with major version 1"},
213+
{loggo.DEBUG, "filtering agent binaries by version: \\d+\\.\\d+\\.\\d+"},
214214
{loggo.TRACE, "no architecture specified when finding agent binaries, looking for "},
215215
{loggo.TRACE, "no series specified when finding agent binaries, looking for \\[.*\\]"},
216216
}

0 commit comments

Comments
 (0)